仿知乎日报第八篇:点击菜单区,切换内容区ViewPager相应的页面

时间:2022-11-05 14:35:31

一.现在我们要实现一个功能,点击菜单区的控件(上面是一个LinearLayout,下面是ListView),点击上面的LinearLayout,则内容区的ViewPager会显示首页,而点击ListView的各个item,则内容区的ViewPager会显示相应的主题日报页面,比如设计日报,日常心理学,电影日报等。

         让我们先看看框架结构:

 仿知乎日报第八篇:点击菜单区,切换内容区ViewPager相应的页面

         LeftFragment是案发地点,你在这点击了LinearLayout(去首页)或者ListView的各个item(去各个主题日报的),这里会把编号传出去,比如点击LinearLayout会把0传出去,ListView的第一个item会把1传出去,第二个item会把传出去,以此类推。这个编号刚好就对应ViewPager的13个页面,刚好就可以用ViewPager的setCurrentItem(传过来的编号)来切换到相应的页面了。

         但是这里又有一个问题了,LeftFragment和MainFragment怎么通信呢?换而言之,怎么在LeftFragment中拿到MainFragment对象呢?我们知道,LeftFragment和MainFragment都传入了上下文MianActivity,在这里面可以创建两个方法分别拿到LeftFragment和MainFragment对象,以后这两个类相互通信就变得方便了。例如,这里可以在LeftFragment的点击事件中,mainActivity.getMainContentFragment()拿到MainFragemnet对象,然后就可以调用MainFragemnt对象的任意方法了,这里我们调用switchPage()方法,该方法里面的逻辑就是用setCurrentItem(index)切换ViewPager的各个页面。

 

 

 

 

二.具体的代码

1. LeftFragment中,LinearLayout和ListView的item的点击事件

public class LeftFragment extends BaseFragment {



@Override
protected void initListener() {
super.initListener();
// LinearLayout控件一点击
mLlHome.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// 拿到MainFragment对象,调用MainFragment的switchPage,
// 传入编号0,切换到ViewPager的第0个页面,即首页
mainActivity.getMainContentFragment().switchPage(0);
// 点击按钮后,菜单关闭
mainActivity.getSlidingMenu().toggle();
}
});
// ListView的item一点击

mLvContent.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 拿到MainFragment对象,调用MainFragment的switchPage,
// 传入编号item所在的位置再加1,切换到ViewPager的第position+1个页面,即各个主题日报页面
mainActivity.getMainContentFragment().switchPage(position +1);
mainActivity.getSlidingMenu().toggle();
}
});
}
}


2. ,为了相互通信,在MainActivity中拿到MainFragment和LeftFragment两个对象   

public class MainActivity extends SlidingFragmentActivity {



public MainFragment getMainContentFragment(){
// 拿到FragmentManager对象
FragmentManager fragmentManager = getSupportFragmentManager();
// 根据标签找到MainFragment,
// 这个标签是transaction.replace(R.id.main_content, mainContentFragment,MAIN_MENU_TAG)的第三个参数,我们之前自己设置的
MainFragment mainContentFragment = (MainFragment)fragmentManager.findFragmentByTag(MAIN_MENU_TAG);
return mainContentFragment;
}


public LeftFragment getLeftContentFragment(){
// 拿到FragmentManager对象
FragmentManager fragmentManager = getSupportFragmentManager();
// 根据标签找到LeftFragment
LeftFragment leftContentFragment = (LeftFragment)fragmentManager.findFragmentByTag(LEFT_MENU_TAG);
return leftContentFragment;
}
}


3.在MainFragment中创建一个方法来切换ViewPager的13个页面

public class MainFragment extends BaseFragment {

public void switchPage(int position){
this.selectedPosition = position;
// 根据传入的编号,切换到相应的页面
mViewPager.setCurrentItem(position);

}


}