【问题标题】:Up Button in Toolbar doesn't do anything工具栏中的向上按钮不执行任何操作
【发布时间】:2016-04-29 09:29:48
【问题描述】:

我在我的应用程序中设置了工具栏(第一次),但我无法设置主页 (/Up) 按钮在单击时执行任何操作。 我有 3 个活动(MainActivity、Second、Third),我已经在所有 3 个活动中定义了工具栏,但是当我在每个活动中单击 Home 按钮时什么都没有发生我希望按钮执行他的(在我的理解中)默认操作是回到 Home Activity 即“MainActivity”。

以下是一些相关代码: 工具栏布局(命名:app_bar.xml):

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

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/toolBar_background"
        android:elevation="5dp"
        android:title="@string/app_name" />
</RelativeLayout> 

我的 3 个活动布局 xmls: Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.noamm_000.finaltoolbarproject.MainActivity">

    <include layout="@layout/app_bar"/>
//More layout code...

Activity_Second.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.example.noamm_000.finaltoolbarproject.Second">

    <include layout="@layout/app_bar"/>
//More layout code...

Activity_Third.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.noamm_000.finaltoolbarproject.Third">

    <include layout="@layout/app_bar"/>
//More layout code

实际上所有 3 个活动都只是包含名为“app_bar.xml”的工具栏布局。

这是我配置 app_parent 的 Mainfest 文件的一部分:

  <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Second"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
            <intent-filter>
                <action android:name="com.example.noamm_000.finaltoolbarproject.Second" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Third"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
            <intent-filter>
                <action android:name="com.example.noamm_000.finaltoolbarproject.Third" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

当然还有我的 3 个活动中的每一个的部分 java 代码: 主要活动:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar_id);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);

        mainBtn = (Button) findViewById(R.id.btn_main);
        openSecondActivity();
    }
    public void openSecondActivity(){
        mainBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.noamm_000.finaltoolbarproject.Second");
                startActivity(intent);
            }
        });

第二个活动:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        btnSecond = (Button) findViewById(R.id.btn_second);

        toolbar = (Toolbar) findViewById(R.id.toolbar_id);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);

        openThirdActivity();
    }

    public void openThirdActivity(){
        btnSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.noamm_000.finaltoolbarproject.Third");
                startActivity(intent);
            }
        });
    }

和ThirdActivity:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        toolbar = (Toolbar) findViewById(R.id.toolbar_id);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
    }

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

您可以看到所有 3 个活动“onCreate”功能几乎相同.. 当我启动我的应用程序时,我可以在所有 3 个活动中看到工具栏,并且我可以看到所有的后退箭头,但单击它什么也不做。 我知道我可以设置toolbar.setNavigationOnClickListener,但我只想让它成为默认操作,即回家活动...... 非常感谢, 诺姆

【问题讨论】:

    标签: android android-studio android-toolbar


    【解决方案1】:

    试试这样...

      @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == android.R.id.home) {
                Intent i = new Intent(CurrentActivity.this, HomeActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    

    【讨论】:

    • 谢谢,它有效,但该按钮不存在默认功能,我不必使用 onOptionsItemSelected 功能定义吗?
    • @Noam..这是此按钮的默认功能..如果您希望工具栏中的向上按钮必须执行一些您定义的特定任务,您必须定义它...
    • @Noam 我的代码会将您带到父活动,而不是仅仅通过返回堆栈。我还添加了 Intent.Flag 来清除后台堆栈,它在进行家庭活动时很有用,并且可以在用户使用“向上”按钮时阻止后台堆栈陷入混乱
    • @sarurabh gupta 我明白你在说什么,只是我按照这个链接youtube.com/… 中的教程进行操作,他根本没有使用 OnOptionsItemSelected 方法,但因为他使用的是 ActionBar 和不是工具栏可能是不同的,我不知道,无论如何我会坚持你和其他人在这里回答我的。再次感谢您。
    • @Noam..是的,这可能是不同的......是的!如果我的回答对您有帮助,请标记为已接受!
    【解决方案2】:

    试试这个:

     @Override
        public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
                case android.R.id.home:
                   //finish(); or Do wahtever you wnat to do
                    return true;
        }
        return true;
    }
    

    【讨论】:

    • 检查this
    • 谢谢,它有效,但该按钮不存在默认功能,我不必使用 onOptionsItemSelected 功能定义吗?
    【解决方案3】:

    如果您有父活动,请遵循此代码,

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                if(NavUtils.getParentActivityIntent(this)== null) {
                    onBackPressed();
                }else{
                    NavUtils.navigateUpFromSameTask(this);
                }
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

    • 谢谢,它有效,但该按钮不存在默认功能,我不必使用 onOptionsItemSelected 功能定义吗?
    【解决方案4】:

    在你的活动中试试这个

    @Override
    public boolean onOptionsItemIdSelected(int id) {   
        switch (id) {
                case R.id.home:
                    //do stuff 
                    break;
        }
        return true;
    }
    

    在您的情况下,我建议您创建一个 AbstractActivity 来继承您的所有活动。因此,您可以考虑多种行为,包括工具栏按钮的管理

    【讨论】:

    • 它应该是 Android.R.id.home (没有 adnroid 字 - 没有任何反应)并且它工作但不存在此按钮的默认功能,我不必定义使用 onOptionsItemSelected 函数?关于您的建议 - 听起来不错,会尝试
    • 这是整个 ToolbarButton 的默认功能 :)
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多