【问题标题】:Clicking toolbar navigation icon crashes the app单击工具栏导航图标会使应用程序崩溃
【发布时间】:2015-01-17 09:09:58
【问题描述】:


我正在尝试 Android 5.0 中的新工具栏小部件。 所以我设置了工具栏的导航图标并尝试使用它。但是当我点击工具栏上的后退按钮时出现以下错误:

    FATAL EXCEPTION: main
java.lang.IllegalArgumentException: Invalid payload item type
at android.util.EventLog.writeEvent(Native Method)
at android.app.Activity.onMenuItemSelected(Activity.java:2628)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:350)
at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:155)
at android.support.v7.app.ActionBarActivityDelegate$1.onMenuItemSelected(ActionBarActivityDelegate.java:74)
at android.support.v7.widget.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:44)
at android.support.v7.internal.widget.ToolbarWidgetWrapper$1.onClick(ToolbarWidgetWrapper.java:190)
at android.view.View.performClick(View.java:4211)
at android.view.View$PerformClick.run(View.java:17267)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
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:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)

此外,如果我使用手机后退按钮,我不会收到任何错误。它只是退出设置活动。
这是我的设置活动:

public class ActivitySettings extends ActionBarActivity {

    private Toolbar toolbar;
    private DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        initToolBar();

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new FragmentSettings()).commit();
    }

    private void initToolBar() {
        toolbar = (Toolbar) findViewById(R.id.toolbar);

        if (toolbar != null) {
            // toolbar.setNavigationIcon(R.drawable.ic_drawer);
            toolbar.setTitle(Html.fromHtml("<font color=\"white\">"
                    + getString(R.string.settings_header_title) + "</font>"));              
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }
}

还有我的 AndroidManifest:

        <activity
            android:name=".ActivitySettings"
            android:label="@string/settings_header_title"
            android:parentActivityName=".ActivityMain" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ActivityMain" />
        </activity>

我尝试清理解决方案,删除 mafifest 父活动名称并将点击侦听器设置为工具栏

toolbar.setNavigationOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    finish();

                }
            });

但它给出了同样的错误。

提前致谢!
设备:三星 Galaxy S3
安卓:4.1.2
Screenshot

【问题讨论】:

    标签: android navigation toolbar android-appcompat material-design


    【解决方案1】:

    问题实际上是您在调用 setSupportActionBar 时在工具栏上设置了非字符串标题。它将最终出现在 ToolbarWidgetWrapper 中,当您单击导航菜单时将在其中使用它。调用 setSuppportActionBar 后,您可以使用任何 CharSequence(例如 Spannable)。

    【讨论】:

      【解决方案2】:

      问题出在

      toolbar.setTitle(Html.fromHtml("<font color=\"white\">sample text</font>"));
      

      不知何故,Android 不允许使用 HTML 字符串设置标题。 (它允许,但是当您单击后退按钮时它会崩溃)我尝试添加 CDATA 但 它不起作用

      Html.fromHtml("<![CDATA[<font color=\"white\">sample text</font>]]>");
      

      正如我在 AndroidManifest.xml 中设置的标题

      android:label="@string/settings_header_title"
      

      我只需要删除该行并设置标题。

      更多信息herehere

      【讨论】:

        【解决方案3】:

        我的导航使用以下实现。

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
        
            switch (item.getItemId()) {
                case android.R.id.home:
                      //implement action 
                 }
        }
        

        【讨论】:

        • 不幸的是,它仍然崩溃。
        • 返回真;此处需要终止控件而不调用超级函数的语句。
        • 感谢您的回答!见answer!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2021-05-16
        相关资源
        最近更新 更多