【问题标题】: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 库是 EventBus 和 Otto。我用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;
}
}