Hiển thị nút quay lại trên thanh hành động


181

Tôi đang cố gắng hiển thị Back buttontrên Action barđể di chuyển trang / hoạt động trước đó hoặc đến trang chính (lần mở đầu tiên). Và tôi không thể làm điều đó.

mã của tôi.

ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);

các mã trong onCreate.


19
Sử dụng: getSupportActionBar (). SetDisplayHomeAsUpEnables (true);
Sukitha Udugamasooriya

@SukithaUdugamasooriya Cảm ơn bạn rất nhiều
Sardorbek Rkh

Câu trả lời:


207

Vâng, đây là một đơn giản để hiển thị nút quay lại

actionBar.setDisplayHomeAsUpEnabled(true);

và sau đó bạn có thể tùy chỉnh sự kiện trở lại tại onOptionsItemSelected

case android.R.id.home:
this.finish();
return true;

tôi đã thêm các dòng trên bên trong onOptionsItemSelected (mục MenuItem), vì tôi đã có một menu trên hành động xấu khi liệt kê các id để chuyển hướng các tùy chọn menu, id nhà không hoạt động khi được nhấp

Nếu bạn gặp phải hành vi kỳ lạ (như trong: bạn sử dụng nút quay lại (R.id.home) của một đoạn và kết thúc việc đóng hoạt động), hãy đảm bảo bạn KHÔNG cài đặt "android: noHistory" cho hoạt động này, bởi vì nếu bạn làm, thậm chí quay lại từ một đoạn đến "tổng quan" của hoạt động sẽ hoàn thành nó.
Igor

2
Đảm bảo rằng bạn đã đặt hoạt động chính trong AndroidMenifest.xml để nút R.id.home hoạt động.
Leap Hawk

192

Tôi nghĩ onSupportNavigateUp()là cách tốt nhất và dễ nhất để làm như vậy, kiểm tra các bước dưới đây. Bước 1 là cần thiết, bước hai có thay thế.

Bước 1 hiển thị nút quay lại: Thêm dòng này trong onCreate()phương thức để hiển thị nút quay lại.

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Bước 2 thực hiện nhấp chuột trở lại: Ghi đè phương thức này

@Override
public boolean onSupportNavigateUp(){  
    finish();  
    return true;  
}

đó là bạn đã hoàn thành
HOẶC Bước 2 thay thế: Bạn có thể thêm meta vào hoạt động trong tệp kê khai dưới dạng

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="MainActivity" />

Chỉnh sửa: Nếu bạn không sử dụng AppCompatActivity thì không sử dụng supportword, bạn có thể sử dụng

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Cảm ơn @atariguy đã bình luận.


2
Giải pháp này hoạt động rất tốt khi bạn cần gửi dữ liệu trở lại hoạt động chính hoặc nếu bạn muốn duy trì các giá trị của EditText trong hoạt động chính. Tôi đã thử onOptionsItemSelectedgiải pháp nhưng không thành công.
Midix

3
Giải pháp tốt nhất +10.
Sediteshwaran

3
Nếu bạn không sử dụng thư viện hỗ trợ cho Actionbar, hãy sửa đổi như sau: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
Hiện tượng. +1. Đơn giản. Thanh lịch. Xinh đẹp. :)
Rohit Kumar

1
Cảm ơn bạn đã giúp đỡ. Bằng cách sử dụng tệp kê khai, nó không hoạt động nhưng sử dụng mã mà nó đang hoạt động
santosh devnath

70

Điều kỳ diệu xảy ra trong onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
Trong trường hợp của tôi, tôi muốn thêm nút quay lại trong trang đó trong đó sự kiện onOptionsItemSelected (mục MenuItem) sẽ không có ở đó ... Có giải pháp nào khác cho điều đó không ??
Vidhi

1
Trước tiên, bạn nên thêm getActionBar().setDisplayHomeAsUpEnabled(true);onCreateMethod cho nút hiển thị trở lại
alavee91

1
Tôi nghĩ rằng nếu bạn làm theo cách này, bạn sẽ không quay lại ngay cả khi bạn bắt đầu lại hoạt động trước đó và giờ đây bạn sẽ tiếp tục tiến lên phía trước cho đến khi tràn ngăn xếp xảy ra nếu bạn tiếp tục đủ lâu. Tôi nghĩ rằng câu trả lời của Igor là chính xác, bạn nên dừng hoạt động này với finish () và để cho khuôn khổ đưa bạn trở lại hoạt động trước đó.
Reijo Korhonen

2
sử dụng this.onBackPressed();phương pháp khi người dùng nhấp vào nút quay lại.
CaptRisky

47

Giải pháp chính thức

Thêm hai đoạn mã đó vào SubActivity của bạn

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(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);
}

thêm dữ liệu meta và ParentActivity vào tệp kê khai để hỗ trợ sdk thấp hơn.

 <application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.SubActivity"
        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.myfirstapp.MainActivity" />
    </activity>
</application>

Tham khảo tại đây: http://developer.android.com/training/imâying-navulation / ancestral.html


5
Lưu ý: nếu sử dụng các thư viện hỗ trợ cho khả năng tương thích ngược, bạn sẽ cần sử dụng "getSupportActionBar ()" thay vì "getActionBar ()". Đây là câu trả lời đầy đủ nhất và chính thức.
Christopher Bull

32

Thêm các dòng này vào onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

và trong onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Hy vọng điều này sẽ giúp bạn..!


27

Hãy thử mã này, chỉ xem xét nó nếu bạn cần nút quay lại.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

17

Trên onCreatephương thức của bạn thêm:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Trong khi xác định trong AndroidManifest.xmlhoạt động chính (hoạt động sẽ được gọi sau khi nhấn nút quay lại trong thanh hành động):

Trong <activity>định nghĩa của bạn về Bản kê khai, thêm dòng:

android:parentActivityName="com.example.activities.MyParentActivity"

Bạn chỉ cần đặt mã Manifest vào nếu bạn đang muốn hỗ trợ các thiết bị trước 4.0. Bit đầu tiên của mã là một giải pháp tốt hơn cho các thư viện hiện tại.
Louie Bertoncin

8

Tôi biết tôi hơi muộn, nhưng đã có thể khắc phục vấn đề này bằng cách theo dõi trực tiếp các tài liệu .

Thêm thẻ siêu dữ liệu vào AndroidManifest.xml(để hệ thống biết)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

Tiếp theo, kích hoạt nút quay lại (lên) trong MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

Và, bạn sẽ được thiết lập tất cả!

Nguồn: Tài liệu dành cho nhà phát triển Android


6

Tôi biết rằng ở trên có nhiều giải pháp hữu ích, nhưng lần này tôi đọc bài viết này (Android Studio 2.1.2 hiện tại với sdk 23) một số phương pháp ở trên không hoạt động.

Dưới đây là giải pháp cho hoạt động phụ của tôi là MapsActivity

Trước tiên, bạn cần thêm ParentActivity trong

AndroidManifest.xml

như thế này :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

Thứ hai, đảm bảo rằng Hoạt động phụ của bạn mở rộng AppCompatActivity, không phải FragmentActivity.

Thứ ba, onOptionsItemSelected()phương thức ghi đè

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Hy vọng điều này sẽ giúp!


4

Hãy thử điều này, trong onCreate () của bạn

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

Và cho nhấp chuột,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

4

Để đạt được điều này, chỉ cần hai bước,

Bước 1: Chuyển đến AndroidManifest.xmlvà thêm tham số này vào <activity>thẻ -android:parentActivityName=".home.HomeActivity"

Thí dụ:

<activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Bước 2: ActivityDetailThêm trang của bạn actioncho trang / hoạt động trước đó

Thí dụ:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

4

trong phương thức onCreate viết-

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

và đây là tệp xml-

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

và trong tệp XML, thay đổi nó thành

Theme.AppCompat.Light.NoActionBar

đây là tất cả những gì chúng ta phải làm


4

Điều này là đơn giản và làm việc cho tôi rất tốt

thêm phương thức này vào bên trong phương thức onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

thêm phương thức này bên ngoài oncreate ()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

3

Trong onCreate()phương thức của bạn thêm dòng này

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

và, trong cùng một Hoạt động, thêm phương thức này để xử lý nút bấm

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        this.finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

2

Tôi đã giải quyết theo cách này

@Override
public boolean  onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}

1

mã làm việc của tôi để trở lại màn hình.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}

1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}

1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) {
        case android.R.id.home: 
            onBackPressed();
            return true;
        }

    return super.onOptionsItemSelected(item);
}

1

Nó có thể là quá muộn để trả lời nhưng theo ý kiến ​​của tôi, tôi có một giải pháp ngắn hơn và nhiều chức năng hơn.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

1

Trong oncreate (); viết dòng này->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

sau đó thực hiện phương thức dưới đây trong lớp đó

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

1

Manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>

1

Để hiển thị nút quay lại thanh hành động trong Kotlin, có 2 cách để thực hiện nó

1. sử dụng Thanh hành động mặc định do Android cung cấp - Hoạt động của bạn phải sử dụng một chủ đề có Thanh hành động - ví dụ: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Thiết kế Thanh hành động của riêng bạn - vô hiệu hóa Thanh hành động mặc định - ví dụ: Theme.AppCompat.Light.NoActionBar - thêm bố cục vào Activity.xml của bạn

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • onCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • tạo nút riêng của bạn
<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >

 <item
     android:id="@+id/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • trong YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }

0

Thêm mã dưới đây trong hàm onCreate:

getSupportActionBar (). setDisplayHomeAsUpEnables (true);

Và sau đó ghi đè: @Override boolean công khai onOptionsItemSelected (mục MenuItem) {onBackPression (); trả lại đúng sự thật; }


0

Trong phiên bản cập nhật getActionBar () không hoạt động!

Thay vào đó, bạn có thể làm điều này bằng cách này

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

thêm nút quay lại trong thanh tiêu đề Android, điều này sẽ giúp bạn trong năm 2020


Cả hai câu trả lời cuối cùng của bạn đều liên kết đến cùng một trang. Bạn có liên kết / liên kết với trang web đó theo bất kỳ cách nào? Nếu bạn được liên kết, bạn phải tiết lộ liên kết đó trong bài viết . Nếu bạn không tiết lộ liên kết, nó được coi là thư rác. Xem: Điều gì biểu thị sự tự quảng cáo "Tốt"? , một số mẹo và lời khuyên về tự quảng cáo , định nghĩa chính xác của "thư rác" cho Stack Overflow là gì? những gì làm cho một cái gì đó thư rác .
Makyen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.