วิธีการใช้ปุ่มย้อนกลับ Android ActionBar?


137

ฉันมีกิจกรรมที่มีมุมมองรายการ เมื่อผู้ใช้คลิกที่รายการไอเท็ม "วิวเวอร์" จะเปิดขึ้น:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

วิธีนี้ใช้งานได้ดี แต่บนแถบการกระทำลูกศรย้อนกลับถัดจากไอคอนแอพจะไม่เปิดใช้งาน ฉันพลาดอะไรไปรึเปล่า?


64
getActionBar().setDisplayHomeAsUpEnabled(true);ในบนสร้างและ switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}ในonOptionsItemSelected? ทั้งใน ServicesViewActivity
Selvin

7
ทำไมไม่เป็นคำตอบของการเก็บเข้าลิ้นชัก?
KarlKarlsom

คำตอบ:


264

Selvin โพสต์คำตอบที่ถูกแล้ว ที่นี่วิธีการแก้ปัญหาในรหัสสวย:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

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

ฟังก์ชันNavUtils.navigateUpFromSameTask(this)ต้องการให้คุณกำหนดกิจกรรมหลักในไฟล์ AndroidManifest.xml

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

ดูที่นี่สำหรับการอ่านเพิ่มเติม


1
ในสถานการณ์ของฉันฉันกำลังมองหาวิธีที่จะไม่โทรหาสร้างผู้ปกครองเมื่อกลับมา ในการทำสิ่งนี้ฉันใช้การใช้งานของคุณ แต่เรียกว่า finish () แทน NavUtils.navigateUpFromSameTask (this) เสร็จสิ้น () โทร onStart ของฉันแทน onCreate ซึ่งเหมาะสำหรับฉันมากกว่า
Jon

การตั้งค่าเมตาดาต้าในไฟล์ Manifest เป็นกุญแจสำคัญในการทำให้ปุ่มนำทางทำงานได้
VSB

ใช้getActionBar().setDisplayHomeAsUpEnabled(true);กรณีที่คุณใช้ห้องสมุดสนับสนุน
Abhinav Upadhyay

คุณจะเปลี่ยนทิศทางของ "การเช็ด" ได้อย่างไร? ตามค่าเริ่มต้นการใช้การนำทางด้านหลังนี้จะกวาดหน้าจอจากขวาไปซ้ายและดูเหมือนว่ากำลังโหลดหน้าจอใหม่ อย่างไรก็ตามฉันต้องการให้มันเช็ดจากซ้ายไปขวาเหมือนกับกดปุ่มย้อนกลับของอุปกรณ์
stingray_

ฉันได้รับข้อผิดพลาด: เกิดจาก: java.lang.NullPointerException: พยายามเรียกวิธีเสมือน 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' ในการอ้างอิงวัตถุ null
Jones

166

ตรวจสอบให้แน่ใจว่าปุ่มโฮมของ ActionBar เปิดใช้งานในกิจกรรม:

Android, API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

ActionBarSherlock และ App-Compatibility, API 7+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android, API 11+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

ตัวอย่างMainActivityที่ขยายActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

วิธีนี้กิจกรรมทั้งหมดที่คุณต้องการสามารถมี backpress

Android, API 16+:

http://developer.android.com/training/implementing-navigation/ancestral.html

AndroidManifest.xml:

<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.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

ตัวอย่างMainActivityที่ขยายActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().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);
    }
}

มันทำงานสำหรับฉันเมื่อฉันเปลี่ยน getSupportActionBar () setDisplayHomeAsUpEnabled (จริง); ในเพื่อ getActionBar () setDisplayHomeAsUpEnabled (จริง); และเพิ่ม @SuppressLint เหล่านี้ ( "NewApi") ในวิธี onCreate ภายในและ outsideFor REF: => developer.android.com/training/implementing-navigation/...
gnganpath

1
ระวัง @ganpath ใช้ getActionBar สำหรับAPI 11 +
Jared Burrows

17

ในการเปิดใช้ปุ่มย้อนกลับของ ActionBar คุณจะต้องมี ActionBar ในกิจกรรมของคุณ ชุดนี้ถูกกำหนดโดยชุดรูปแบบที่คุณใช้ AndroidManfiest.xmlคุณสามารถตั้งค่ารูปแบบสำหรับกิจกรรมของคุณใน หากคุณใช้เช่น@android:style/Theme.NoTitleBarชุดรูปแบบคุณไม่มี ActionBar ในกรณีนี้การเรียกเพื่อgetActionBar()ส่งคืนค่าว่าง ดังนั้นตรวจสอบให้แน่ใจว่าคุณมี ActionBar ก่อน

ขั้นตอนต่อไปคือการตั้งค่าเป็นandroid:parentActivityNameกิจกรรมที่คุณต้องการนำทางหากคุณกดปุ่มย้อนกลับ สิ่งนี้ควรทำในเวลาAndroidManifest.xmlเดียวกัน

ตอนนี้คุณสามารถเปิดใช้งานปุ่มย้อนกลับในonCreateวิธีการของกิจกรรม "ลูก" ของคุณ

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

ตอนนี้คุณควรใช้ตรรกะสำหรับปุ่มย้อนกลับ คุณเพียงแค่แทนที่onOptionsItemSelectedวิธีการใน "เด็ก" android.R.id.homeของคุณกิจกรรมและตรวจสอบรหัสของปุ่มย้อนกลับซึ่งเป็น

ตอนนี้คุณสามารถใช้วิธีการได้NavUtils.navigateUpFromSameTask(this); แต่ถ้าคุณไม่ได้ระบุandroid:parentActivityNameในตัวคุณAndroidManifest.xmlสิ่งนี้จะทำให้แอปของคุณเสียหาย

บางครั้งนี่คือสิ่งที่คุณต้องการเพราะเตือนให้คุณลืมว่า "บางสิ่ง" ดังนั้นหากคุณต้องการป้องกันสิ่งนี้คุณสามารถตรวจสอบว่ากิจกรรมของคุณมีผู้ปกครองใช้getParentActivityIntent()วิธีนี้หรือไม่ ถ้าสิ่งนี้ส่งคืนค่า null คุณไม่ได้ระบุพาเรนต์

ในกรณีนี้คุณสามารถใช้onBackPressed()วิธีการที่คล้ายกับว่าผู้ใช้กดปุ่มย้อนกลับบนอุปกรณ์ การใช้งานที่ดีซึ่งไม่เคยเกิดปัญหาแอปของคุณคือ:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

กรุณาแจ้งให้ทราบว่าภาพเคลื่อนไหวที่ผู้ใช้จะเห็นความแตกต่างกันระหว่างและNavUtils.navigateUpFromSameTask(this);onBackPressed()

มันขึ้นอยู่กับคุณว่าคุณไปทางไหน แต่ฉันคิดว่าวิธีแก้ปัญหามีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณใช้คลาสฐานสำหรับกิจกรรมทั้งหมดของคุณ


10

ไฟล์ AndroidManifest:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

เพิ่มใน DetailsActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

มันใช้งานได้:]


ดูเหมือนว่านี่เป็นวิธีที่ง่ายที่สุดสำหรับฉัน ขอบคุณ
TuanDPH



3

https://stackoverflow.com/a/46903870/4489222

เพื่อให้บรรลุนี้มีเพียงสองขั้นตอนคือ

ขั้นตอนที่ 1: ไปที่ AndroidManifest.xml และในการเพิ่มพารามิเตอร์ในแท็ก - android: parentActivityName = ". home.HomeActivity"

ตัวอย่าง:

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

ขั้นตอนที่ 2: ใน ActivityDetail เพิ่มการกระทำของคุณสำหรับหน้า / กิจกรรมก่อนหน้า

ตัวอย่าง:

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

3

ในเมธอด OnCreate เพิ่มสิ่งนี้:

if (getSupportActionBar() != null)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

จากนั้นเพิ่มวิธีนี้:

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


1

หากคุณใช้งาน Toolbar ฉันกำลังเผชิญกับปัญหาเดียวกัน ฉันแก้ไขได้โดยทำตามสองขั้นตอนเหล่านี้

  1. ใน AndroidManifest.xml
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. ใน SecondActivity เพิ่มสิ่งเหล่านี้ ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

ขั้นตอนต่อไปนี้มีมากพอที่จะปุ่มย้อนกลับ:

ขั้นตอนที่ 1: รหัสนี้ควรอยู่ใน Manifest.xml

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

ขั้นตอนที่ 2: คุณจะไม่ยอมแพ้

finish();

ในกิจกรรมผู้ปกครองของคุณในขณะที่เริ่มกิจกรรมเด็ก

ขั้นตอนที่ 3: หากคุณต้องการกลับมาที่กิจกรรมผู้ปกครองจากกิจกรรมเด็กคุณเพียงแค่ให้รหัสนี้สำหรับกิจกรรมเด็ก

startActivity(new Intent(ParentActivity.this, ChildActivity.class));

0

จากคำตอบของจาเร็ดฉันต้องเปิดใช้งานและใช้พฤติกรรมปุ่มย้อนกลับของแถบแอ็คชั่นในหลายกิจกรรมและสร้างคลาสผู้ช่วยนี้เพื่อลดการทำสำเนารหัส

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

การใช้งานในกิจกรรม:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    ActionBarHelper.enableBackButton(this);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.