首页是负责抽屉的实现,然后控制内容页中的显示:
package com.yang.weibo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
public class MyHomePage extends FragmentActivity {
public static final String[] TITLES = { "微博", "消息中心--评论", "消息中心--@我的" };
private DrawerLayout mDrawer_layout;// DrawerLayout容器
private RelativeLayout mMenu_layout_left;// 左边抽屉
private ListView menu_listview_l;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_home_page);
mDrawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
mMenu_layout_left = (RelativeLayout) findViewById(R.id.menu_layout_left);
menu_listview_l = (ListView) findViewById(R.id.menu_listView_l);
menu_listview_l.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, TITLES));
// 监听菜单
menu_listview_l
.setOnItemClickListener(new DrawerItemClickListenerLeft());
if (savedInstanceState == null) {
WeiBoPullDownList fragment = new WeiBoPullDownList(MyHomePage.this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_layout, fragment).commit();
}
}
/**
* 左侧列表点击事件
*
*/
public class DrawerItemClickListenerLeft implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
Fragment fragment = null;
Toast.makeText(getApplicationContext(), position + "",
Toast.LENGTH_SHORT).show();
// 根据item点击行号判断启用哪个Fragment
switch (position) {
case 0:
fragment = new WeiBoPullDownList(MyHomePage.this);
break;
case 1:
fragment = new CommentsMe(MyHomePage.this);
break;
case 2:
fragment = new AtMe(MyHomePage.this);
break;
default:
break;
}
ft.replace(R.id.fragment_layout, fragment);
ft.commit();
mDrawer_layout.closeDrawer(mMenu_layout_left);// 关闭mMenu_layout
}
}
}
问题一:
内容页继承的Fragment应该统一,我的全部为android.support.v4.app.Fragment,注意用eclipse自动导包时别出现问题,因为有时会导入android.app.Fragment,造成在实例化的时候出错,找起来很隐蔽。
(1)android.app.Fragment:兼容的最低版本是android:minSdkVersion="11"
因此你的应用不能兼容3.0以下的应用。
可以使用<fragment>标签的,这点很重要,如果是用android.support.v4.app.Fragment的话,是不能是用<fragment>标签的,会抛出android.view.InflateException: Binary XML file line #7: Error inflating class fragment异常
(2)android.support.v4.app.Fragment:可以兼容到1.6的版本,不能使用<fragment>标签,需要在程序中通过add或者replace的方式添加,同时还需要
android-support-v4.jar
fragment的使用教程请大家参考官网的demo,那个是以android.app.Fragment为例子的,可以使用getFragmentManager(),activity的一个方法,
要是用android.support.v4.app.Fragment,需要继承FragmentActivity,使用getSupportFragmentManager,这两个方法都是为了
得到fragmentManager,名字一样但是包名不一样。
问题二:
一个fragment界面里面嵌套了一个viewpager,viewpager里面放的两个fragment的适配器,第一次执行时都正常显示,第二次执行时viewpager显示数据为空。
调试打印logo显示viewpager适配器的getItem()方法没有执行,原因是fragment里面又嵌套了fragment,所以在创建viewpager的适配器的时候传参为getChildFragmentManager()而不是getFragmentManager(),因为如果传参为getFragmentManager()则表示将父Fragment的FragmentManager传给了子Fragment,所以无法显示数据。
第二个问题的解决办法是网友提供的:http://www.th7.cn/Program/Android/201406/218498.shtml
问题三:
在刚开始使用Fragment的时候,一直出来不了数据,打印log可以看的出来已经有数据存在,但是不显示,问题根源在onCreateView方法。
我最初的做法是将view的初始化及适配器填充放在onCreate中,但是对于onCreateView没有做任何方法处理,正常返回View,问题的导致就在这里,返回的view是静态布局数据,有下拉刷新等触发反应,但都是控件本身的动画效果,但实际的数据并没有真正填充,最后的解决办法是在onCreateView中来初始化view控件。
onCreate是指创建该fragment类似于Activity.onCreate,你可以在其中初始化除了view之外的东西,onCreateView是创建该fragment对应的视图,你必须在这里创建自己的视图并返回给调用者,例如
return inflater.inflate(R.layout.fragment_settings, container, false);。
super.onCreateView有没有调用都无所谓,因为super.onCreateView是直接返回null的。
fragment的生命周期跟Activity很相近: