FragmentActivityとFragmentの両方のインタラクション方法の概要

7329 ワード

Android 4.0以降はFragmentを大量に使用することが多く、FragmentとActivityのインタラクションは非常に重要であるはずですが、現在はFragmentとActivityのインタラクションの方法しか紹介されていません.ActivityとFragmentのインタラクションの方法はありません.以下に解決の考え方を記録します.
  1.まず、FragmentをFragmentActivityのコントロールとインタラクティブにするための共通インタフェースを定義する必要があります.
  
public interface IBtnCallListener {

  public void transfermsg();
  }

2.fragmentのButtonコントロールがFragmentActivityのButtonコントロールと対話する必要がある場合、Fragmentに対応するサブクラスで定義する
public class LaunchUIFragment extends Fragment implements 
IBtnCallListener{

  IBtnCallListener mbtnListener;
  private Button btn_Click;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
  Bundle savedInstanceState) {
  View rootView = inflater.inflate(R.layout.fragment_selection_launch, 
container, false);
  btn_Click=(Button) rootView.findViewById(R.id.bt_click);
  btn_Click.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  mbtnListener.transfermsg();
  }
  });
  return rootView;
  }
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onActivityCreated(savedInstanceState);
  }
  @Override
  public void onAttach(Activity activity) {
  // TODO Auto-generated method stub
  try {
  mbtnListener=(IBtnCallListener) activity;
  } catch (Exception e) {
  // TODO: handle exception
  throw new ClassCastException(activity.toString() + "must implement 
mbtnListener");
  }
  super.onAttach(activity);
  }
  @Override
  public void transfermsg() {
  // TODO Auto-generated method stub
  System.out.println(" Activity ");
  }
  }

同時にFragmentActivityで対応
  
public class MainActivity extends FragmentActivity implements 
IBtnCallListener{

  public static final String ARGUMENTS_NAME = "arg";
  private RelativeLayout rl_nav;
  private SyncHorizontalScrollView mHsv;
  private RadioGroup rg_nav_content;
  private ImageView iv_nav_indicator;
  private ImageView iv_nav_left;
  private ImageView iv_nav_right;
  private ViewPager mViewPager;
  private int indicatorWidth;
  public static String[] tabTitle = { " 1", " 2", " 3", " 4", " 5" }; 
// 
  private LayoutInflater mInflater;
  private TabFragmentPagerAdapter mAdapter;
  private int currentIndicatorLeft = 0;
  private Button Btn_Test;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  findViewById();
  initView();
  setListener();
  }
  /*
  private void setListener() {
  mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
  @Override
  public void onPageSelected(int position) {
  if(rg_nav_content!=null && 
rg_nav_content.getChildCount()>position){
  ((RadioButton)rg_nav_content.getChildAt(position)).performClick();
  }
  }
  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
  }
  @Override
  public void onPageScrollStateChanged(int arg0) {
  }
  });
  rg_nav_content.setOnCheckedChangeListener(new OnCheckedChangeListener() 
{
  @Override
  public void onCheckedChanged(RadioGroup group, int checkedId) {
  if(rg_nav_content.getChildAt(checkedId)!=null){
  TranslateAnimation animation = new TranslateAnimation(
  currentIndicatorLeft ,
  ((RadioButton) rg_nav_content.getChildAt(checkedId)).getLeft(), 0f, 
0f);
  animation.setInterpolator(new LinearInterpolator());
  animation.setDuration(100);
  animation.setFillAfter(true);
  // 
  iv_nav_indicator.startAnimation(animation);
  mViewPager.setCurrentItem(checkedId); //ViewPager    
  //     
  currentIndicatorLeft = ((RadioButton) 
rg_nav_content.getChildAt(checkedId)).getLeft();
  mHsv.smoothScrollTo(
  (checkedId > 1 ? ((RadioButton) 
rg_nav_content.getChildAt(checkedId)).getLeft() : 0) - ((RadioButton) 
rg_nav_content.getChildAt(2)).getLeft(), 0);
  }
  }
  });
  }
  private void initView() {
  DisplayMetrics dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);
  indicatorWidth = dm.widthPixels / 4;
  LayoutParams cursor_Params = iv_nav_indicator.getLayoutParams();
  cursor_Params.width = indicatorWidth;//  
  iv_nav_indicator.setLayoutParams(cursor_Params);
  mHsv.setSomeParam(rl_nav, iv_nav_left, iv_nav_right, this);
  // 
  mInflater = 
(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
  // 
  // LayoutInflater mInflater = LayoutInflater.from(this);
  initNavigationHSV();
  mAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager());
  mViewPager.setAdapter(mAdapter);
  Btn_Test=(Button) findViewById(R.id.btn_test);
  Btn_Test.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  mBtnCallListener.transfermsg();
  }
  });
  }
  */
  private IBtnCallListener mBtnCallListener;
  @Override
  public void onAttachFragment(Fragment fragment) {
  // TODO Auto-generated method stub
  try {
  mBtnCallListener=(IBtnCallListener) fragment;
  } catch (Exception e) {
  // TODO: handle exception
  }
  super.onAttachFragment(fragment);
  }
  @Override
  public void transfermsg() {
  // TODO Auto-generated method stub
  System.out.println(" Fragment ");
  }
  /*
  private void initNavigationHSV() {
  rg_nav_content.removeAllViews();
  for(int i=0;i 
  RadioButton rb = (RadioButton) 
mInflater.inflate(R.layout.nav_radiogroup_item, null);
  rb.setId(i);
  rb.setText(tabTitle[i]);
  rb.setLayoutParams(new LayoutParams(indicatorWidth,
  LayoutParams.MATCH_PARENT));
  rg_nav_content.addView(rb);
  }
  }
  private void findViewById() {
  rl_nav = (RelativeLayout) findViewById(R.id.rl_nav);
  mHsv = (SyncHorizontalScrollView) findViewById(R.id.mHsv);
  rg_nav_content = (RadioGroup) findViewById(R.id.rg_nav_content);
  iv_nav_indicator = (ImageView) findViewById(R.id.iv_nav_indicator);
  iv_nav_left = (ImageView) findViewById(R.id.iv_nav_left);
  iv_nav_right = (ImageView) findViewById(R.id.iv_nav_right);
  mViewPager = (ViewPager) findViewById(R.id.mViewPager);
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
  }
  public static class TabFragmentPagerAdapter extends 
FragmentPagerAdapter{
  public TabFragmentPagerAdapter(FragmentManager fm) {
  super(fm);
  }
  @Override
  public Fragment getItem(int arg0) {
  Fragment ft = null;
  switch (arg0) {
  case 0:
  ft = new LaunchUIFragment();
  break;
  default:
  ft = new CommonUIFragment();
  Bundle args = new Bundle();
  args.putString(ARGUMENTS_NAME, tabTitle[arg0]);
  ft.setArguments(args);
  break;
  }
  return ft;
  }
  @Override
  public int getCount() {
  return tabTitle.length;
  }
  }*/
  }

ここで、主な部分はFragmentがOnAttachメソッドを書き換え、インタフェースオブジェクトをインスタンス化するとともに、Activityで対応するインタフェースを実現する方法であり、このメソッドで所望の機能を実現することで、Fragment ActivityのコンテンツとコントロールをFragmentで柔軟に対話することができます.
同様にFragmentActivityがインタラクティブに対応したいFragmentもFragmentActivityのOnAttachFragmentメソッドを書き換える必要があり、同時に
Fragmentで対応するインタフェースを実現する方法で、その方法であなたが望む機能を実現することで、FragmentActivityによってFragmentの内容とコントロールを柔軟に対話することができます(主に注釈のない部分を見てください)
実は、インタラクティブな考え方はすべて同じで、すべて1つの共通のインタフェースを通じて呼び出して、対応する場所で実現します.