【问题标题】:Back button in action bar doesn't work操作栏中的后退按钮不起作用
【发布时间】:2016-10-29 15:15:18
【问题描述】:

我试图在这个非常简单的活动中启用后退按钮(由另一个活动实例化),但我总是得到空指针异常,因此当我启动活动时我的应用程序崩溃(没有后退按钮活动的操作栏效果很好)。 我尝试了许多在互联网上发布的不同解决方案,但没有一个有效...... 我正在关注本指南:Android Developer providing up navigation

这里是清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.projectcalculator">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        android:screenOrientation="portrait">
        <!--attività principale-->
        <activity
            android:name=".MainActivity"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--attività infixToPostfix-->
        <activity
            android:name=".InfixToPostfixActivity"
            android:launchMode="singleTask"
            android:label="@string/infix_to_postfix"/>
        <!--attività figlia di infixToPostfix-->
        <activity
            android:name=".ShowPostfixProcedureActivity"
            android:launchMode="standard"
            android:label="@string/postfix_procedure"
            android:parentActivityName=".InfixToPostfixActivity" />
    </application>

</manifest>

这里是activity的java文件(ShowPostfixProcedureActivity):

package com.example.android.projectcalculator;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import java.util.Stack;

import static java.lang.Character.isDigit;

public class ShowPostfixProcedureActivity extends AppCompatActivity {

    private static String equation;
    private static int openBracket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.show_infix_to_postfix_jurney);
        Toolbar myToolbar = (Toolbar) findViewById(R.id.infix_to_postfix_toolbar_procedure);
        setSupportActionBar(myToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        TextView txview = (TextView)findViewById(R.id.postfix_jurney_text_wall);
        Stack<String> s = new Stack<String>();
        s = DataProcessor.ReturnProcess();
        txview.setText(s.pop());
        while (!s.empty())
        {
            if (s.peek().charAt(0) == '<')
            {
                txview.append(Html.fromHtml(s.pop()));
            }
            else
            {
                txview.append(s.pop());
            }
        }
        //Log.d("SPPA/onCreate","text = "+DataProcessor.ReturnProcess());
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.action_bar_postfix_procedure, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId()) {
            // Respond to the action bar's Up/Home button
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }


}

布局相关的XML文件(show_infix_to_postfix_jurney):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--ActionBar in alto-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/infix_to_postfix_toolbar_procedure"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#42f480"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical">

        <TextView
            android:id="@+id/postfix_jurney_text_wall"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="10sp"
            android:textSize="20sp"
            android:gravity="center"
            android:background="#f2f2f2"/>

    </ScrollView>

</LinearLayout>

最后是导航栏相关的 XML 文件(action_bar_postfix_procedure):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">



</menu>

这里是错误信息:

10-29 17:14:43.841 18822-18822/com.example.android.projectcalculator E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                       Process: com.example.android.projectcalculator, PID: 18822
                                                                                       Theme: themes:{}
                                                                                       java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setEnabled(boolean)' on a null object reference
                                                                                           at com.example.android.projectcalculator.ShowPostfixProcedureActivity.onCreateOptionsMenu(ShowPostfixProcedureActivity.java:51)
                                                                                           at android.app.Activity.onCreatePanelMenu(Activity.java:2852)
                                                                                           at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:340)
                                                                                           at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
                                                                                           at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:258)
                                                                                           at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
                                                                                           at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
                                                                                           at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
                                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:5461)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 菜单 XML 为空...你真的需要onCreateOptionsMenu 方法吗?
  • 您将 MENU xml 留为空白,这就是发生空 Ponter 异常的原因。
  • 看起来您的堆栈跟踪和源代码不相关。也许尝试清理您的项目并停止即时运行。你也应该打电话给super.onCreateOptionsMenu(menu)
  • 你在哪里,只要我把任何东西放在菜单文件中,它就开始工作了!谢谢你^^

标签: java android android-layout nullpointerexception android-toolbar


【解决方案1】:

我不知道NavUtils.navigateUpFromSameTask(this); 这行应该做什么。如果您想在按下后退按钮时关闭活动,请将其替换为方法调用onBackPressed()

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            onBackPressed()
            return true;
    }
    return super.onOptionsItemSelected(item);
}

【讨论】:

  • 要在用户按下应用图标时向上导航,您可以使用 NavUtils 类的静态方法 navigateUpFromSameTask()。当您调用此方法时,它会完成当前活动并启动(或恢复)相应的父活动。 - developer.android.com/training/implementing-navigation/…
  • @cricket_007 谢谢。不确定这是否是他正在使用的用户自己的课程。我一直只是使用后按来关闭活动,因为如果需要,我可以设置 Intent。
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多