Android 는 Fragment 를 이용 하여 Tab 옵션 효과 구현

Fragment 를 이용 하여 Tab 옵션 효과 구현:
RadioGroup 과 Fragment 를 집합 하여 tab 옵션 효 과 를 실현 합 니 다.이 중 가장 중요 한 파일 은 다음 과 같 습 니 다.
1.Fragment TabAdapter 클래스:

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener
{
 private List<Fragment> fragments; //   tab      Fragment

 private RadioGroup rgs; //     tab

 private Activity activity; // Fragment   Activity

 private int fragmentContentId; // Activity          id

 private int currentTab; //   Tab    

 private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; //          tab        

 public FragmentTabAdapter(Activity activity, List<Fragment> fragments, int fragmentContentId, RadioGroup rgs)
 {
 this.fragments = fragments;
 this.rgs = rgs;
 this.activity = activity;
 this.fragmentContentId = fragmentContentId;

 //        
 android.app.FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
 ft.add(fragmentContentId, fragments.get(0));
 ft.commit();

 rgs.setOnCheckedChangeListener(this);

 }

 @Override
 public void onCheckedChanged(RadioGroup radioGroup, int checkedId)
 {
 for(int i = 0; i < rgs.getChildCount(); i++)
 {
  if(rgs.getChildAt(i).getId() == (checkedId))
  {
  Fragment fragment = fragments.get(i);
  FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
  getCurrentFragment().onPause(); //     tab
  // getCurrentFragment().onStop(); //     tab

  if(fragment.isAdded())
  {
   // fragment.onStart(); //     tab onStart()
   fragment.onResume(); //     tab onResume()
  }
  else
  {
   ft.add(fragmentContentId, fragment);
  }
  showTab(i); //     tab
  ft.commit();

  //        tab        
  if(null != onRgsExtraCheckedChangedListener)
  {
   onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i);
  }

  }
 }

 }

 /**
 *   tab
 * @param idx
 */
 private void showTab(int idx)
 {
 for(int i = 0; i < fragments.size(); i++)
 {
  Fragment fragment = fragments.get(i);
  FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
  if(idx == i)
  {
  ft.show(fragment);
  }
  else
  {
  ft.hide(fragment);
  }
  ft.commit();
 }
 currentTab = idx; //     tab   tab
 }

 public int getCurrentTab()
 {
 return currentTab;
 }

 public Fragment getCurrentFragment()
 {
 return fragments.get(currentTab);
 }

 public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener()
 {
 return onRgsExtraCheckedChangedListener;
 }

 public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener)
 {
 this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;
 }

 /**
 *   tab        
 */
 public interface OnRgsExtraCheckedChangedListener
 {
 void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index);
 }
} 
2.activity_main.xml 레이아웃 파일:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="@android:color/white"
 android:orientation="vertical" >

 <LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >

 <FrameLayout
  android:id="@+id/tab_content"
  android:layout_width="fill_parent"
  android:layout_height="0dp"
  android:layout_weight="1.0"
  android:background="#77557799" />

 <RadioGroup
  android:id="@+id/tabs_rg"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:orientation="horizontal"
  android:paddingBottom="7dp"
  android:paddingTop="7dp" >

  <RadioButton
  android:id="@+id/tab_rb_a"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:background="@drawable/selector_tab"
  android:button="@null"
  android:checked="true"
  android:drawableTop="@drawable/tablatestalert"
  android:gravity="center"
  android:singleLine="true"
  android:text="Tab1"
  android:textColor="#000000"
  android:textSize="13sp" />

  <RadioButton
  android:id="@+id/tab_rb_b"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:background="@drawable/selector_tab"
  android:button="@null"
  android:drawableTop="@drawable/tabsearch"
  android:gravity="center"
  android:singleLine="true"
  android:text="Tab2"
  android:textColor="#000000"
  android:textSize="13sp" />

  <RadioButton
  android:id="@+id/tab_rb_c"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:background="@drawable/selector_tab"
  android:button="@null"
  android:drawableTop="@drawable/tabrecommd"
  android:gravity="center"
  android:singleLine="true"
  android:text="Tab3"
  android:textColor="#000000"
  android:textSize="13sp" />
 </RadioGroup>
 </LinearLayout>

</LinearLayout>
3.MainActivity 클래스:

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class MainActivity extends Activity
{
 private RadioGroup rgs;
 private List<Fragment> fragments = new ArrayList<Fragment>();
 private int index;
 private static Boolean isExit = false;
 private static Boolean hasTask = false;
 private RadioButton button;
 private Timer tExit = new Timer();
 private TimerTask task = new TimerTask()
 {
 @Override
 public void run()
 {
  isExit = false;
  hasTask = true;
 }
 };

 private FragmentTabAdapter tabAdapter;

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 fragments.add(new FragmentOne());
 fragments.add(new FragmentTwo());
 fragments.add(new FragmentThree());

 rgs = (RadioGroup) findViewById(R.id.tabs_rg);

 button = (RadioButton) findViewById(R.id.tab_rb_a);

 tabAdapter = new FragmentTabAdapter(this, fragments, R.id.tab_content, rgs);
 tabAdapter.setOnRgsExtraCheckedChangedListener(new FragmentTabAdapter.OnRgsExtraCheckedChangedListener()
 {
  @Override
  public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index)
  {
  //     index    ,       ,             Fragment
  System.out.println("Extra---- " + index + " checked!!! ");
  MainActivity.this.index = index;
  }
 });
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
 if(keyCode == KeyEvent.KEYCODE_BACK)
 {
  if(index == 0)
  {
  if(isExit == false)
  {
   isExit = true;
   Toast.makeText(MainActivity.this, "        ", Toast.LENGTH_SHORT).show();
   if(!hasTask)
   {
   tExit.schedule(task, 1000);
   }
  }
  else
  {
   finish();
   System.exit(0);
  }
  }
  else
  {
  //        ,             Fragment
  //      check     onCheckedChanged       
  // rgs.check(button.getId());
  button.setChecked(true);
  }

 }
 return false;
 }
}
Fragment 라 이 프 사이클 을 동시에 배우 기 위해 저 는 Fragment 의 모든 라 이 프 사이클 방법 에 log 인쇄 를 추 가 했 습 니 다.하 나 는 세 개의 Fragment 가 있 습 니 다.저 는 그 중의 한 코드 만 붙 였 고 나머지 는 이것 과 같 습 니 다.

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class FragmentOne extends BaseFragment
{

 private View view;
 

 @Override
 public void onAttach(Activity activity)
 {
 super.onAttach(activity);
 Log.d(TAG, "1==>FragmentOne=>onAttach");
 }

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
 Log.d(TAG, "2==>FragmentOne==>onCreate");
 super.onCreate(savedInstanceState);
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
 {
 Log.d(TAG, "3==>FragmentOne==>onCreateView");
 view = inflater.inflate(R.layout.fragment1, container, false);
 TextView tv = (TextView) view.findViewById(R.id.tv);
 tv.setText("FragmentOne");
 return view;
 }

 @Override
 public void onActivityCreated(Bundle savedInstanceState)
 {
 Log.d(TAG, "4==>FragmentOne==>onActivityCreated");
 super.onActivityCreated(savedInstanceState);
 }

 @Override
 public void onStart()
 {
 Log.d(TAG, "5==>FragmentOne==>onStart");
 super.onStart();
 }

 @Override
 public void onResume()
 {
 Log.d(TAG, "6==>FragmentOne==>onResume");
 super.onResume();
 }

 @Override
 public void onPause()
 {
 Log.d(TAG, "7==>FragmentOne==>onPause");
 super.onPause();
 }

 @Override
 public void onStop()
 {
 Log.d(TAG, "8==>FragmentOne==>onStop");
 super.onStop();
 }

 @Override
 public void onDestroyView()
 {
 Log.d(TAG, "9==>FragmentOne==>onDestroyView");
 super.onDestroyView();
 }

 @Override
 public void onDestroy()
 {
 Log.d(TAG, "10==>FragmentOne==>onDestroy");
 super.onDestroy();
 }

 @Override
 public void onDetach()
 {
 Log.d(TAG, "11==>FragmentOne==>onDetach");
 super.onDetach();
 }

 @Override
 public void onViewCreated(View view, Bundle savedInstanceState)
 {

 Log.d(TAG, "FragmentOne==>onViewCreated");
 super.onViewCreated(view, savedInstanceState);
 }
}
작성 하 는 과정 에서 홈 페이지 가 아니라면 첫 번 째 Fragment 로 먼저 이동 하 는 효 과 를 실현 하기 위해 처음에는 rgs.check(button.getId()을 사 용 했 습 니 다.이 방법 은 결과 에 따 르 면 onCheckedChanged 감청 사건 이 두 번 실 행 된 후에 button.setChecked(true)로 바 뀌 었 습 니 다.이 방법 후에 이 문 제 를 성공 적 으로 해결 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기