我开发了一个Android应用程序,我遇到了一些问题.
在我的MainActivity中,我有以下组件:
>导航抽屉(实例化并加载许多碎片)
> VIEwPager(仅适用于显示文章详细视图的ArticleFragment)
normaly,VIEwPager与特定的Activity有关,但我真的想同时使用Navigation Drawer和VIEwPager.唯一的方法是在同一个活动中实现这两个元素.
DrawerLayout由导航抽屉本身和内容区域组成.在我的内容区域中,我有一个FrameLayout和VIEwPager.问题是始终显示VIEwPager.
所以我的想法是使用androID:visibility属性来交替显示/隐藏FrameLayout和VIEwPager.如果查看我的activity_main.xml,您会发现在VIEwPager上将androID:visibility设置为不可见.
/layout/activity_main.xml
<!-- The main content vIEw --> <relativeLayout androID:ID="@+ID/content_frame" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <FrameLayout androID:ID="@+ID/container" androID:paddingtop="?androID:attr/actionbarSize" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /> <!-- VIEwPager --> <androID.support.v4.vIEw.VIEwPager xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID="@+ID/pager" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:visibility="invisible" /> </relativeLayout> <!-- The navigation drawer --> <fragment androID:ID="@+ID/navigation_drawer" androID:layout_wIDth="@dimen/navigation_drawer_wIDth" androID:layout_height="match_parent" androID:layout_gravity="start" androID:name="NavigationDrawerFragment" /></androID.support.v4.Widget.DrawerLayout>
然后:
MainActivity.java
public class MainActivity extends ActionBaractivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { private NavigationDrawerFragment mNavigationDrawerFragment; private FrameLayout mContainer; private VIEwPager mPager; private PagerAdapter mPagerAdapter; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); // Set up the navigation drawer mContainer = (FrameLayout) findVIEwByID(R.ID.container); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentByID(R.ID.navigation_drawer); mNavigationDrawerFragment.setUp(R.ID.navigation_drawer, (DrawerLayout) findVIEwByID(R.ID.drawer_layout)); // Set up the vIEwpager mPager = (VIEwPager) findVIEwByID(R.ID.pager); mPagerAdapter = new ScreenSlIDePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.setonPagechangelistener(new VIEwPager.SimpleOnPagechangelistener() { @OverrIDe public voID onPageSelected(int position) { invalIDateOptionsMenu(); } }); } //-------------------------------// // NAVIGATION DRAWER // //-------------------------------// /** * Update the main content by replacing fragments */ @OverrIDe public voID onNavigationDrawerItemSelected(int position) { Fragment fragment = null; Boolean vIEwPagerArticles = false; switch (position) { case 0: fragment = new HomeFragment(); break; case 1: fragment = new FooFragment(); break; case 2: vIEwPagerArticles = true; // HIDe navigation drawer container and show the vIEwpager mContainer.setVisibility(FrameLayout.GONE); mPager.setVisibility(VIEwPager.VISIBLE); // NullPointerException with new this line. Why? // Fragment already instanciate in ScreenSlIDePagerAdapter -> getItem() -> ArticleFragment.create()? //fragment = new ArticleFragment(); break; default: break; } // Show the vIEw pager and hIDe navigation drawer container // ================= // THE BUG IS HERE // ================= if (!vIEwPagerArticles) { mContainer.setVisibility(FrameLayout.VISIBLE); mPager.setVisibility(VIEwPager.GONE); } if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.ID.container, fragment) .commit(); } } ... //-------------------------------// // VIEWPAGER // //-------------------------------// private class ScreenSlIDePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlIDePagerAdapter(FragmentManager fm) { super(fm); } @OverrIDe public Fragment getItem(int position) { return DayFragment.create(position); } @OverrIDe public int getCount() { ... } } ...}
NavigationDrawerFragment.java
http://pastebin.com/LwKZnNiB
显示VIEwPager内容
在我的HomeFragment上,我有一个带有onClickListener的按钮:
mbutton.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { ((MainActivity)getActivity()).onNavigationDrawerItemSelected(2); }});
当我加载MainActivity时,我遇到了以下错误:InflateException和NullPointerException
AndroIDRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androID/com.example.androID.ui.MainActivity}: androID.vIEw.InflateException: Binary XML file line #34: Error inflating class fragment at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2211) at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at androID.app.ActivityThread.access0(ActivityThread.java:141) at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at androID.os.Handler.dispatchMessage(Handler.java:99) at androID.os.Looper.loop(Looper.java:137) at androID.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: androID.vIEw.InflateException: Binary XML file line #34: Error inflating class fragment at androID.vIEw.LayoutInflater.createVIEwFromTag(LayoutInflater.java:713) at androID.vIEw.LayoutInflater.rInflate(LayoutInflater.java:755) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:492) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:397) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:353) at com.androID.internal.policy.impl.PhoneWindow.setContentVIEw(PhoneWindow.java:267) at androID.app.Activity.setContentVIEw(Activity.java:1895) at androID.support.v7.app.ActionBaractivity.superSetContentVIEw(ActionBaractivity.java:216) at androID.support.v7.app.ActionBaractivityDelegateICS.setContentVIEw(ActionBaractivityDelegateICS.java:111) at androID.support.v7.app.ActionBaractivity.setContentVIEw(ActionBaractivity.java:76) at com.example.androID.ui.MainActivity.onCreate(MainActivity.java:42) at androID.app.Activity.performCreate(Activity.java:5133) at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2175) at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at androID.app.ActivityThread.access0(ActivityThread.java:141) at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at androID.os.Handler.dispatchMessage(Handler.java:99) at androID.os.Looper.loop(Looper.java:137) at androID.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.example.androID.ui.MainActivity.onNavigationDrawerItemSelected(MainActivity.java:117) at com.example.androID.ui.NavigationDrawerFragment.selectItem(NavigationDrawerFragment.java:202) at com.example.androID.ui.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:80) at androID.support.v4.app.Fragment.performCreate(Fragment.java:1477) at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:893) at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1082) at androID.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1184) at androID.support.v4.app.FragmentActivity.onCreateVIEw(FragmentActivity.java:291) at androID.vIEw.LayoutInflater.createVIEwFromTag(LayoutInflater.java:685) at androID.vIEw.LayoutInflater.rInflate(LayoutInflater.java:755) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:492) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:397) at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java:353) at com.androID.internal.policy.impl.PhoneWindow.setContentVIEw(PhoneWindow.java:267) at androID.app.Activity.setContentVIEw(Activity.java:1895) at androID.support.v7.app.ActionBaractivity.superSetContentVIEw(ActionBaractivity.java:216) at androID.support.v7.app.ActionBaractivityDelegateICS.setContentVIEw(ActionBaractivityDelegateICS.java:111) at androID.support.v7.app.ActionBaractivity.setContentVIEw(ActionBaractivity.java:76) at com.example.androID.ui.MainActivity.onCreate(MainActivity.java:42) at androID.app.Activity.performCreate(Activity.java:5133) at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2175) at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at androID.app.ActivityThread.access0(ActivityThread.java:141) at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at androID.os.Handler.dispatchMessage(Handler.java:99) at androID.os.Looper.loop(Looper.java:137) at androID.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
一切都很好(没有错误,活动加载)没有:
// ================= // THE BUG IS HERE // ================= if (!vIEwPagerArticles) { mContainer.setVisibility(FrameLayout.VISIBLE); mPager.setVisibility(VIEwPager.GONE); }
…但它不符合我的期望,因为导航抽屉片段总是隐藏(由于mContainer.setVisibility(FrameLayout.GONE),它是正常的.)我只想反转mContainer / mPager可见性.
我希望我足够清楚……!
任何的想法?
解决方法:
您得到NullPointerException,因为您构建NavigationDrawerFragment片段的方式.更准确地说,在onCreate()方法中,您调用selectItem(),它通过Activity(注册为侦听器)传播到onNavigationDrawerItemSelected()回调.问题是片段在调用setContentVIEw()时会膨胀(在onCreate()中),这意味着你将在行之前输入onNavigationDrawerItemSelected()回调:
mContainer = (FrameLayout) findVIEwByID(R.ID.container);mPager = (VIEwPager) findVIEwByID(R.ID.pager);
运行,在onNavigationDrawerItemSelected()中呈现这些引用为null.
要解决此问题,您只需替换当前的< fragment />即可.使用基本容器(例如占位符为空的FrameLayout)从Activity布局标记,并在上面的行(绑定视图的位置)之后在onCreate()中手动添加NavigationDrawerFragment.可能有另一种更好的解决方案(或者我可以提出其他建议)但是你不清楚如何处理可见性.也许你可以扩展这个.
编辑2:
@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); // Set up the navigation drawer mContainer = (FrameLayout) findVIEwByID(R.ID.container); // Set up the vIEwpager mPager = (VIEwPager) findVIEwByID(R.ID.pager); mPagerAdapter = new ScreenSlIDePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.setonPagechangelistener(new VIEwPager.SimpleOnPagechangelistener() { @OverrIDe public voID onPageSelected(int position) { invalIDateOptionsMenu(); } }); if (savedInstanceState == null) { NavigationDrawerFragment ndf = new NavigationDrawerFragment(); ndf.setUp(R.ID.navigation_drawer, (DrawerLayout) findVIEwByID(R.ID.drawer_layout)); getSupportFragmentManager().beginTransaction().add(R.ID.nav_drawer, ndf).commit(); }}
编辑1:
//...<!-- VIEwPager --> <androID.support.v4.vIEw.VIEwPager xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID="@+ID/pager" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:visibility="invisible" /> </relativeLayout> <!-- The navigation drawer --> <FrameLayout androID:ID="@+ID/nav_drawer" androID:layout_wIDth="@dimen/navigation_drawer_wIDth" androID:layout_height="match_parent" androID:layout_gravity="start" /></androID.support.v4.Widget.DrawerLayout>
最后在onCreate()中:
//...mPager.setAdapter(mPagerAdapter); mPager.setonPagechangelistener(new VIEwPager.SimpleOnPagechangelistener() { @OverrIDe public voID onPageSelected(int position) { invalIDateOptionsMenu(); } });getSupportFragmentManager().beginTransaction().add(R.ID.nav_drawer, new NavigationDrawerFragment()).commit();
如果您使用上面的代码获得异常,那么它是否在onNavigationDrawerItemSelected()方法中?
总结以上是内存溢出为你收集整理的android – 导航抽屉Viewpager setVisibility = InflateException / NullPointer全部内容,希望文章能够帮你解决android – 导航抽屉Viewpager setVisibility = InflateException / NullPointer所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)