DrawerLayout来实现侧滑,遇到问题总结

首页是负责抽屉的实现,然后控制内容页中的显示:

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很相近:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值