《新闻》之笔记二

来源:互联网 发布:云计算的具体应用案例 编辑:程序博客网 时间:2024/05/19 21:15
  现在菜单已经出来了,问1:怎么往菜单里添加数据,初始化菜单呢?
答:用一个Fragment替换掉菜单布局中的FrameLayout帧布局. 
 SlidingMenu  用一个 Fragment 替换布局,里面是一个ListView.
 fragment 不能独立存在,是依赖Activity的。 
fragment生命周期:  与Activity生命周期对应关系:
created --  >onAttach(),onCreate(),onCreateView(),onActivityCreated().
started -- > onStart();
resumed -- > onResume();
paused -- > onPause();
stopped -- > onStop();
destroyed -- > onDestroyView(),onDestroy(),onDetach().
oncreateView()   想当于 setcontentview(xml);
具体怎么实现,上代码:
public class MenuFragment extends Fragment implements OnItemClickListener {private View view;private String tag = "MenuFragment";@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);ListView list_view = (ListView) view.findViewById(R.id.list_view);ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, android.R.id.text1,initData());list_view.setAdapter(adapter);list_view.setOnItemClickListener(this);}private List<String> initData() {   List<String> list = new ArrayList<String>();list.add("fragment1");list.add("fragment2");list.add("fragment3");list.add("fragment4");list.add("fragment5");return list;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Override  //返回这个Fragment显示的Viewpublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {view = LayoutInflater.from(getActivity()).inflate(R.layout.list_view,null);return view;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Fragment f  = null;switch (position) { //点击让主界面用不同的Fragment替换掉case 0:f  =new Fragment1();break;case 1:f  =new Fragment2();break;case 2:f  =new Fragment3();break;case 3:f  =new Fragment4();break;case 4:f  =new Fragment5();break;}        switchFragment(f);}private void switchFragment(Fragment f) {if(f != null){if(getActivity() instanceof MainActivity){  ((MainActivity)getActivity()).switchFragment(f);}}}}
因为菜单用我们的MenuFragment替换掉,而MenuFragment的CreateView()中的布局为R.layout.list_view:
<?xml version="1.0" encoding="utf-8"?><ListView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/list_view" >   </ListView>
当点击菜单页中ListView的item时,要实现主界面显示不同的内容,在这里创建了5个Fragment的类。问2:点击的内容是在SlidingMenu菜单里面,而主界面在Activity中,那怎么实现在SlidingMenu一点击就替换Activity中的内容呢?
答:用回调,在外面做开发时,很多情况都是用Fragment动态替换布局,这样只要一个界面就可以,这时把布局设定为帧布局FrameLayout.
 这样,就要在MainAcitivity中暴露一个方法(设成public),让MenuFragment能访问到. MenuFragment怎么才能访问到MainActivity的方法呢?Activity又不能new一个对象,这样做:
private void switchFragment(Fragment f) {
if(f != null){
if(getActivity() instanceof MainActivity){
((MainActivity)getActivity()).switchFragment(f);
} }
}
感觉上面的写法有点小牛逼啊,这就是回调,把 Fragment 传递回了MainActivity.

小知识点:
1》在创建Fragment时,onCreateView()方法有这条代码:
   TextView textview = new TextView(getActivity());
   textview.setText(Fragment1.class.getSimpleName());  //这里的Fragment1.class.getSimpleName()就会根据类名自动替换。

2》、xml 转换成View.

① 在Activity中最常见的方法
     View view= setcontentview(xml);
②  View view  = LayoutInflater.from(getActivity()).inflater(xml,null);  //常用的
     在布局会变化,不能确定是常用。
③ LayoutInflater  inflater=(LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view  = inflater.inflater(xml,null);
问3:②和③ 有什么区别呢?
答:②是③的一个封装。

3》什么叫暴露一个接口?

 “隐藏实现,暴露接口”这是在java程序设计时一个重要的理念,我们在创建一个类的时候,肯定会对外提供有一些访问该类的方法(实例方法或构造方法)否则该类就会完全独立,也就失去了设计该类的意义和价值,从某种意义上讲,这些在类中对外公布的方法也可以说是接口,而interface只不过是把操作这个类的方式写成一个单独的class而已(当然他同时还实现了其他很多功能),我们就可以通过“接口回调”的方式操纵实现接口的类。
     举个简单的例子,我们现在要开发一个系统,他由服务端的程序和客户端的程序组成,客户端必然要与服务端通讯(发送请求),就要调用服务端的方法,而在服务端,不可能把所有的程序都暴露给客户端,它就会通过“接口”的方式,因为接口中只描述抽象方法,而把该接口的实现隐藏起来了,客户端就只需调用接口的方法,如getName(),客户端知道只要调用了这个方法,就可以收到一个name的返回值,而不需要关心这个方法是怎样实现的,这样就实现了客户端和服务端的分离,彼此开发不受影响,服务端开发人员只要告诉客户端他会提供的接口即可或客户端开发人员向服务端开发人员提出需要怎样的接口即可。

4》Fragment 方法抽取 ---  BaseFragment的封装

 每个Fragment 都有 oncreate --->oncreateView --->onActivityCreat() 方法,可以把它们抽取一下,形成一个BaseFragment.  它提供两个方法 initView(),initData(),都是抽象方法。
 然后后面要用Fragment 只需要继承自 BaseFragment,实现initView(),initData()就可以了,而 oncreate --->oncreateView --->onActivityCreat() 方法都自动继承了。

public abstract class BaseFragment extends Fragment {public View view;private Context ct;@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);initData(savedInstanceState);}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ct = getActivity();}/*** setContentView;返回一个View */@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {view = initView(inflater);return view;}/*** 初始化view */public abstract View initView(LayoutInflater inflater);/*** 初始化数据 */public abstract void initData(Bundle savedInstanceState);}


0 0