【问题标题】:ActionBarCompat + NavigationDrawerFragment doesnt work on android 4.0 and 4.1ActionBarCompat + Navigation Drawer Fragment 在 android 4.0 和 4.1 上不起作用
【发布时间】:2013-10-30 12:58:24
【问题描述】:

很奇怪的问题! 我通过 android studio 中的新项目向导创建了一个新项目。我选择包含 GridLayout、Fragments、NavigationDrawer 和 ActionBar 的支持库。在下一步中,我选择了带有 NavigationDrawer 导航的 BlankActivity 模板。向导很好地创建了我的项目并毫无问题地构建它。

问题是这样的,当您尝试运行它时,它在 Android 4.3、4.2 和 2.3.3 上运行良好,但在 4.0 和 4.1 上崩溃。

堆栈跟踪:

10-30 13:11:31.024    2136-2136/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.navdrawer/com.navdrawer.MainActivity}: android.view.InflateException: Binary XML file line #24: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        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 #24: Error inflating class fragment
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
        at android.app.Activity.setContentView(Activity.java:1867)
        at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
        at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
        at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)
        at com.navdrawer.MainActivity.onCreate(MainActivity.java:37)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
            at android.app.ActivityThread.access$600(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.navdrawer.MainActivity.onCreateOptionsMenu(MainActivity.java:82)
        at android.app.Activity.onCreatePanelMenu(Activity.java:2476)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224)
        at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224)
        at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:141)
        at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199)
        at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:280)
        at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:393)
        at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:747)
        at android.app.Activity.invalidateOptionsMenu(Activity.java:2595)
        at android.support.v4.app.ActivityCompatHoneycomb.invalidateOptionsMenu(ActivityCompatHoneycomb.java:29)
        at android.support.v4.app.FragmentActivity.supportInvalidateOptionsMenu(FragmentActivity.java:633)
        at android.support.v7.app.ActionBarActivity.supportInvalidateOptionsMenu(ActionBarActivity.java:170)
        at android.support.v4.app.Fragment.setHasOptionsMenu(Fragment.java:781)
        at com.navdrawer.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:82)
        at android.support.v4.app.Fragment.performCreate(Fragment.java:1455)
        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:285)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
... 24 mo

这是片段中的 onCreateOptionsMenu

 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // If the drawer is open, show the global app actions in the action bar. See also
        // showGlobalContextActionBar, which controls the top-left area of the action bar.
        if (mDrawerLayout != null && isDrawerOpen()) {
            inflater.inflate(R.menu.global, menu);
            showGlobalContextActionBar();
        }
        super.onCreateOptionsMenu(menu, inflater);
    }

这个在MainActivity中

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

【问题讨论】:

  • 你能把 sn-p onCreateOptionsMenu() 显示为 LayoutInflater 在里面仍然为空吗?
  • 您更新到最新的 Android 支持库 v18 了吗?为了安全起见,您可以使用Sherlock ActionBar
  • 你去试试吧....
  • 我用过 Sherlock 很多次,我或多或少都满意,现在我正在研究 ActionBarCompat 库的可能性

标签: android android-studio navigation-drawer android-actionbar-compat


【解决方案1】:

刚刚遇到了同样的问题。确切的问题。

问题是 setHasOptionsMenu(true); 在 Fragment 中调用 onCreate 而不是 onActivityCreated。如果您问我,这似乎是向导中的错误。

要解决此问题,请将 setHasOptionsMenu(true); 调用从 onCreate() 移至 onActivityCreated()

这将解决问题。当调用到达Activity#onCreateOptionsMenu 时,片段实例将被实例化。

【讨论】:

【解决方案2】:

我解决了问题。堆栈跟踪完全误导了我......

问题是在活动中的 onCreateOptionsMenu() 中建议的 eee...

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

不知何故,仅在 Android 4.1 和 4.0 上 mNavigationDrawerFragment 为空,尽管它已在 onCreate() 中初始化,所以我把它放了

if(mNavigationDrawerFragment == null )
            mNavigationDrawerFragment = (NavigationDrawerFragment)
                    getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);

onCreate()onCreateOptionsMenu() 方法中

【讨论】:

  • 成为我的好朋友 :) 谢谢 - 这为我解决了问题
【解决方案3】:

我通过为

放置一个 try catch 块解决了这个问题
setHasOptionsMenu(true); 

正如 Donn Felker 解释的那样,异常是由于在创建活动之前调用而产生的。 处理这个异常可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 2022-10-12
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多