【问题标题】:How to propagate onClick event from fragment to activity when using FragmentPagerAdapter?使用 FragmentPagerAdapter 时如何将 onClick 事件从片段传播到活动?
【发布时间】:2017-02-01 08:03:45
【问题描述】:

我有这个片段:

class FooFragment extends Fragment {

  FooListener mListener;

  interface OnFooListener {
    void onFoo();
  }

  class FooListener implements View.OnClickListener {
    void onClick(View view) {
      mListener.onFoo();
    }
  }

  void onAttach(Context context) {
    Assert.assertTrue(context instanceof OnFooListener);
    super.onAttach(context);
    mListener = (OnFooListener) context;
  }

  void onCreateView(...) {
    ...
    button.setOnClickListener(new ClickListener());
  }
}

FooFragment 期望 Context 是 OnFooListener 的一个实例,并且 onClick 事件使用这种机制传播到 Activity(在我的例子中),即上下文。

“拥有”片段的 Activity 是 FooFragment 的上下文,因为我在我的 Activity 布局中声明了<fragment>(这就是我的理解)。

现在,我想把这个片段放在滑动视图中,我在this guide 之后实现了它。一个类继承自一个Activity内部的FragmentPagerAdapter,负责处理片段,例如:

class TabsActivity extends AppCompatActivity {
  void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);
    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    LocalAdapter adapter = new LocalAdapter(getSupportFragmentAdapter());
    pager.setAdapter(adapter);
  }

  class LocalAdapter extends FragmentPagerSupport {
    static LAYOUTS[] = {
      new DebugFragment()
    };
    int getCount() {
      return LAYOUTS.length;
    }
    Fragment getItem(int position) {
      return LAYOUTS[position];
    }
  }
}

如何将FooFragment 放入此类中,以便将事件传播到 TabsActivity?在这种情况下,我不明白我的片段的上下文是什么。

我可以放置一个 setter,但这意味着我需要在 LocalAdapter 中对这个特定的类进行特定处理,这似乎很麻烦,因为我需要片段和父 Activity 之间的交互。

谢谢,

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    在您的片段中,您可以执行以下操作(注意演员表):

       onClick() {
           ((TabsActivity)getActivity()).myMethod();
       }
    

    【讨论】:

    • 我选择了这个解决方案:我在onAttach() 中使用getActivity() 而不是context。谢谢。
    【解决方案2】:

    我遇到了类似场景的问题,为了简化代码,我们选择使用事件总线库。

    最适合我们的库是 GreenRobot 的 EventBus,但还有很多其他的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多