在工具栏上显示后退箭头

Huy*_* Tu 457 android android-actionbar android-actionbar-compat android-toolbar

我正在从我的应用程序迁移ActionBarToolbar.但我不知道如何在Back Arrow上显示和设置click事件Toolbar就像我一样Actionbar.

在此输入图像描述

ActionBar,我打电话mActionbar.setDisplayHomeAsUpEnabled(true).但是没有像这样的类似方法.

有没有人遇到这种情况,并以某种方式找到了解决它的方法?

MrE*_*r13 835

如果您使用的是ActionBarActivity,你可以告诉Android的使用Toolbar作为ActionBar像这样:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

然后打电话给

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Run Code Online (Sandbox Code Playgroud)

将工作.您也可以在附加到ActionBarActivities您的片段中使用它可以像这样使用它:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);
Run Code Online (Sandbox Code Playgroud)

如果您没有使用ActionBarActivities或者如果您想要将后箭头Toolbar设置为未设置为您的后箭头,SupportActionBar则可以使用以下内容:

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});
Run Code Online (Sandbox Code Playgroud)

如果您正在使用android.support.v7.widget.Toolbar,那么您应该将以下代码添加到您的AppCompatActivity:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是最新版本的appcompat-v7(21.0.3或更高版本),则可以使用R.drawable.abc_ic_ab_back_mtrl_am_alpha作为支持库中包含的后箭头drawable. (68认同)
  • 请注意,不推荐使用getResources().getDrawable(...).您应该使用ContextCompat.getDrawable(context,...)代替. (23认同)
  • 谷歌官方Material Design图标repo https://github.com/google/material-design-icons/blob/master/navigation/drawable-xhdpi/ic_arrow_back_black_48dp.png (12认同)
  • 从支持库`toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material)中获取"后退"图标;` (10认同)
  • 没有工作,找不到`R.drawable.abc_ic_ab_back_mtrl_am_alpha`既没有`R.drawable.ic_action_back`. (7认同)
  • 不推荐使用`ActionBarActivity`(@deprecated使用{@link android.support.v7.app.AppCompatActivity}代替.).这是否意味着必须手动处理点击事件? (2认同)
  • @hgoebl不,只需使用AppCompatActivity类而不是ActionBarActivity. (2认同)

Vas*_*hev 202

我看到很多答案,但这里是我以前没有提到的.它适用于API 8+.

public class DetailActivity extends AppCompatActivity

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

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

    // add back arrow to toolbar
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }

    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

  • upvote for`onOptionItemSelected()`这完成了MrEngineer13在他的回答中未涉及的内容. (19认同)
  • 这仅在您将工具栏设置为ActionBar时才有效.它不适用于独立工具栏. (3认同)
  • 谢谢这对我有用.似乎比使用点击监听器更好,我真的不关心独立的工具栏 (2认同)

Igo*_*lov 157

有很多方法可以实现这一点,这是我的最爱:

布局:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:navigationIcon="?attr/homeAsUpIndicator" />
Run Code Online (Sandbox Code Playgroud)

活动:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 使用theme属性比这个问题中的大多数其他建议要好得多 (11认同)
  • 而不是使用`setNavigationOnClickListener()`你可以添加`case android.R.id.home:`inside'onOptionsItemSelected()`. (3认同)
  • 这是最真实的解决方案,特别是如果您想使用安卓系统的默认后退图标。 (2认同)

Sam*_*Sam 73

您可以使用工具栏setNavigationIcon方法. Android Doc

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • R.drawable.abc_ic_ab_back_mtrl_am_alpha现在支持23.2.0,改为使用接受的答案. (2认同)

Pha*_*inh 20

如果您不想创建自定义Toolbar,可以这样做

public class GalleryActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...  
        getSupportActionBar().setTitle("Select Image");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
}                     
Run Code Online (Sandbox Code Playgroud)

在你身上 AndroidManifest.xml

<activity
    android:name=".GalleryActivity"
    android:theme="@style/Theme.AppCompat.Light">        
</activity>
Run Code Online (Sandbox Code Playgroud)

你也可以把这个android:theme="@style/Theme.AppCompat.Light"<aplication>标记,适用于所有活动

在此输入图像描述

  • 感谢`if(item.getItemId()== android.R.id.home)` (2认同)

Ily*_*man 18

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed(); // Implemented by activity
        }
    });
Run Code Online (Sandbox Code Playgroud)

对于API 21+ android:navigationIcon

<android.support.v7.widget.Toolbar
    android:navigationIcon="@drawable/back_arrow"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"/>
Run Code Online (Sandbox Code Playgroud)


Pao*_*eri 16

我在Google Developer Documentation中使用了这种方法:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

如果你得到一个空指针异常,它可能取决于主题.尝试在清单中使用不同的主题或者使用此选项:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

然后在清单中,我为当前活动设置父活动:

<activity
        android:name="com.example.myapp.MyCurrentActivity"
        android:label="@string/title_activity_display_message"
     android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myapp.MyMainActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)

我希望这能帮到您!


Dhi*_*pta 13

如果您正在使用AppCompatActivity并且已经走上了不使用它的道路,因为您不想获得ActionBar它提供的自动化,因为您想要分离出Toolbar,因为您的Material Design需求和CoordinatorLayout或者AppBarLayout,请考虑以下因素:

你仍然可以使用它AppCompatActivity,你不需要停止使用它,这样你就可以<android.support.v7.widget.Toolbar>在你的xml中使用它.只需关闭操作栏样式,如下所示:

首先,从你喜欢的NoActionBar主题之一派生一个样式styles.xml,我这样使用Theme.AppCompat.Light.NoActionBar:

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/primary_dark</item>
    ...
    ...
</style>
Run Code Online (Sandbox Code Playgroud)

在App的清单中,选择刚刚定义的子样式主题,如下所示:

    <activity
        android:name=".activity.YourSuperCoolActivity"
        android:label="@string/super_cool"
        android:theme="@style/SuperCoolAppBarActivity">
    </activity>
Run Code Online (Sandbox Code Playgroud)

在Activity Xml中,如果工具栏的定义如下:

...
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        />
...
Run Code Online (Sandbox Code Playgroud)

然后,这是重要的部分,您支持操作栏设置为您正在扩展的AppCompatActivity,以便xml中的工具栏成为操作栏.我觉得这是一种更好的方法,因为你可以简单地做ActionBar允许的许多事情,比如菜单,自动活动标题,项目选择处理等,而不需要添加自定义点击处理程序等.

在Activity的onCreate覆盖中,执行以下操作:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_super_cool);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);
    //Your toolbar is now an action bar and you can use it like you always do, for example:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 13

如果您使用的是androidx.appcompat.app.AppCompatActivityjust use:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

然后只需在Manifest.xml父Activity中定义即可。

<activity
    android:name=".MyActivity"
    ...>
  <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".ParentActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)

相反,如果您正在使用 aToolbar并且您想要自定义行为,请使用:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar" 
    app:navigationIcon="?attr/homeAsUpIndicator"
    .../>
Run Code Online (Sandbox Code Playgroud)

并在您的活动中:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //....
    }
});
Run Code Online (Sandbox Code Playgroud)


Art*_*miy 7

MyActivity extends AppCompatActivity {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        toolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(arrow -> onBackPressed());
    }
Run Code Online (Sandbox Code Playgroud)


小智 7

显示工具栏上的后退按钮的简便方法

将此代码粘贴到onCreate方法中

 if (getSupportActionBar() != null){

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
Run Code Online (Sandbox Code Playgroud)

将此替代方法粘贴到onCreate方法之外

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()== android.R.id.home) {

        finish();
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)


Anu*_*hav 6

首先,您需要初始化工具栏:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

然后从操作栏中调用后退按钮:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Run Code Online (Sandbox Code Playgroud)


Dev*_*per 5

AppCompatActivity比如你可以这样做

public class GrandStatActivity extends AppCompatActivity {

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

    @Override
    public void onResume() {
        super.onResume();

        // Display custom title
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setTitle(R.string.fragment_title_grandstats);

        // Display the back arrow
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    // Back arrow click event to go to the parent Activity
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 5

Easily you can do it.

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

积分:https : //freakycoder.com/android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e


gpr*_*our 5

在科特林,那将是

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}
Run Code Online (Sandbox Code Playgroud)