这节课学习的是创建带侧边栏的Fragment
新建一个Navigation Drawer 的Activity,命名为SliderActivity
会自动创建很多文件,其中包括一个主布局文件:fragment_slider.xml和一个侧边栏布局文件:fragment_navigation_drawer.xml
要启动这个侧边栏activity,从FlaceholderFragment来启动
在fragment_main.xml中添加一个按钮:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动有侧边栏的Activity" android:id="@+id/btnStartSliderActivity" />
在PlaceholderFragment中的onCreateView中添加这个按钮的事件:
运行这个app,可以实现一个默认的简单侧边栏功能。//获取侧边栏按钮 rootView.findViewById(R.id.btnStartSliderActivity).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //启动这个Activity,这里使用getActivity(),是因为Activity也是一个context startActivity(new Intent(getActivity(),SliderActivity.class)); } });
侧边栏的控件在NavigationDrawerFragment类中的onCreateView函数。会根据其中的ListView进行初始化,所以,侧边栏也是一个ListView,也就是一个列表对象。
给侧边栏列表添加一个内容,修改ListView中的String数组:
然后修改SliderActivity类的onSectionAttached方法:new String[]{ getString(R.string.title_section1), //"Section 1", getString(R.string.title_section2),<span style="font-family: 宋体; font-size: 9pt;"> //"Section 2",</span> getString(R.string.title_section3),<span style="font-family: 宋体; font-size: 9pt;"> //"Section 3",</span> "hello 侧边栏", }));
mTitle为点击侧边栏按钮后页面的顶部标题,case 4: mTitle = "我是侧边栏"; break;
然后运行看看效果~~~
查看NavigationDrawerFragment类中的onCreateView函数可以看到:public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mDrawerListView = (ListView) inflater.inflate( R.layout.fragment_navigation_drawer, container, false); mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } }); mDrawerListView.setAdapter(new ArrayAdapter<String>( getActionBar().getThemedContext(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, new String[]{ getString(R.string.title_section1), getString(R.string.title_section2), getString(R.string.title_section3), "hello 侧边栏", })); mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); return mDrawerListView; }
创建了一个ListView,然后在ListView中添加了一些数据,然后设置了ListView的事件监听器,在ListView的某一项被点击之后,会执行一个selectItem(position);这是selectItem()方法:private void selectItem(int position) { mCurrentSelectedPosition = position; if (mDrawerListView != null) { mDrawerListView.setItemChecked(position, true); } if (mDrawerLayout != null) { mDrawerLayout.closeDrawer(mFragmentContainerView); } if (mCallbacks != null) { mCallbacks.onNavigationDrawerItemSelected(position); } }
会发现调用了mCallbacks.onNavigationDrawerItemSelected(position);然后发现mCallbacks在上方是这么定义的:private NavigationDrawerCallbacks mCallbacks;进入NavigationDrawerCallbacks 发现它是一个自定义的接口。然后回到SliderActivity类中,发现它又实现了这个接口。也就是说,在SliderActivity类中有监听从NavigationDrawerFragment中发出的事件。所以,NavigationDrawerFragment的onCreateView就可以改写成:public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.slider_content,container,false); root.findViewById(R.id.btnGoToNewPage).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳转到新页面 if(mCallbacks !=null){ mCallbacks.onGoToNewPageBtnCliked(); } } }); return root; }
因为这个操作需要通过NavigationDrawerCallbacks 接口来传递给SliderActivity,所以,需要在这个接口函数中再新定义一个函数:void onGoToNewPageBtnCliked();
回到SliderActivity类中,实现接口的onGoToNewPageBtn()方法,并如下编写:
//跳转新页面按钮监听 @Override public void onGoToNewPageBtnCliked() { getSupportFragmentManager().beginTransaction().replace(R.id.container,new newpageFragment()).commit(); }
创建一个新的Fragment---newpageFragment类,继承v4.app的Fragment,并重写onCreateView函数。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //创建一个布局,初始化一个View布局 View root = inflater.inflate(R.layout.newpage_wevview,container,false); WebView wv = (WebView) root.findViewById(R.id.wv); //加载新页面的url wv.loadUrl("http://www.baidu.com"); return root; }
创建一个布局newpage_wevview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/wv"></WebView> </LinearLayout>
如果想让程序能访问百度等页面,需要有访问互联网的权限,修改AndroidMainfest.xml文件,添加如下代码:<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>