android– 导航抽屉Viewpager setVisibility = InflateExceptionNullPointer

android– 导航抽屉Viewpager setVisibility = InflateExceptionNullPointer,第1张

概述我开发了一个Android应用程序,我遇到了一些问题.在我的MainActivity中,我有以下组件:>导航抽屉(实例化并加载许多碎片)>ViewPager(仅适用于显示文章详细视图的ArticleFragment)Normaly,ViewPager与特定的Activity有关,但我真的想同时使用NavigationDrawer和ViewPager.唯一的方

我开发了一个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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存