【问题标题】:Setting up on click for Floating action button设置单击浮动操作按钮
【发布时间】:2015-08-25 16:01:16
【问题描述】:

我的 activity_main 中有一个 FAB,我有 5 个 ViewPager 片段。片段有 RecyclerView。如何从主活动访问此 RecyclerView 并设置 FAB 的单击方法,以便在单击 FAB 时,活动片段中的 recyclerview 滚动到顶部。我尝试在片段中使用mRecyclerView.scrollToPosition(0)。但它不适用于所有片段。我有这个片段。我应该将以下内容放在主要的activity.java中吗?如何在片段中点击 FAB 时访问 RecyclerView 并将其滚动到位置 0?

public void setFloatingActionButton(){
    fab = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mRecyclerView.scrollToPosition(0);
        }
    });
}

【问题讨论】:

    标签: android android-fragments android-activity android-recyclerview


    【解决方案1】:

    最简单最简单的解决方案是使用 EventBus。

    Android 的两个最佳 EventBus 库是 EventBusOtto。我用otto。

    您需要做的就是在放置回收视图的片段中注册总线。并编写一个方法,例如

    public void scrollToStart(){
     //body here.
    }
    

    像这样订阅上面的方法到总线上。

    @Subscribe   // subscribing an event to the bus.
    public void scrollToStart(ScrollToStartEvent event){ //you need to create an event class e.g ScrollToStartEvent
     //body here.
    }
    

    现在 FAB onClick Listner。

    public void setFloatingActionButton(){
        fab = (android.support.design.widget.FloatingActionButton) 
        getActivity().findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BUS.post(new ScrollToStartEvent()); //NOTICE
            }
        });
    }
    

    注意:我所做的只是发布了一个活动,在您的情况下为 ScrollToStartEvent()。 Bus 将检查是否有任何方法订阅了此事件并调用该特定方法。您必须阅读 EventBus 文档才能正确理解这一点。

    优点: 更少的代码和更易读的代码。可以传递复杂的对象(不需要对象序列化)。

    缺点:您需要学习如何使用 EventBus。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我不确定这是否会有所帮助,但我在活动中设置了 FAB onClick,这就是我的做法。我有基于正在查看的片段位置的条件操作。

      @Override
      public void onClick(View v) {
          switch(v.getId()){
              case R.id.fab:
                  if(viewPager.getCurrentItem()==0){
                      Toast.makeText(this,"First",Toast.LENGTH_LONG).show();
                  }
                  else{
                      Toast.makeText(this,"Second",Toast.LENGTH_LONG).show();
                  }
          }
      }
      

      在我的示例中,我只有 2 个片段,因此我硬编码了 0 并执行了 if else。在你的情况下,我会在开关中使用一个开关。还有一个组织所有片段的好方法是使用private SparseArray<WeakReference<Fragment>> fragmentMap = new SparseArray<WeakReference<Fragment>>();

      你会包括这个:

      @Override
      public void onAttachFragment(Fragment fragment) {
          Bundle bundle = fragment.getArguments();
          if(bundle!=null && bundle.containsKey(KEY_FRAGMENT_POSITION)){
              int position = bundle.getInt(KEY_FRAGMENT_POSITION);
              fragmentMap.put(position, new WeakReference<Fragment>(fragment));
          }
          super.onAttachFragment(fragment);
      }
      
      public Fragment getFragment(int type){
          WeakReference<Fragment> weakFrag = fragmentMap.get(type);
          Fragment frag = null;
          if (weakFrag != null)
              frag =  weakFrag.get();
          return frag;
      }
      

      【讨论】:

        【解决方案3】:

        有时,当活动事件由于 XML 或事件的结构方式而在链中丢失时,下面的结构是确保事件到达正确位置的最佳结构。

        public class MainActivity extends AppCompatActivity implements View.OnClickListener 
        {
            @Override
                public void onClick(View v) {
                    Log.v(LOG_HEADER,"onClick");       
                }
        }
        
        public class SearchFragment extends Fragment
        {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
                LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.fragment_search, container, false);
                ll.setOnClickListener((MainActivity)getActivity());
                return ll;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-07-26
          • 1970-01-01
          • 1970-01-01
          • 2017-05-20
          • 1970-01-01
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          • 2015-06-25
          相关资源
          最近更新 更多