ในหลาย ๆ แอพ (ปฏิทิน, ไดรฟ์, Play Store) เมื่อคุณแตะปุ่มและเข้าสู่กิจกรรมใหม่ไอคอนในแถบชื่อเรื่องจะเปลี่ยนเป็นปุ่มย้อนกลับ แต่สำหรับแอปที่ฉันกำลังสร้างนั้นจะไม่ทำเช่นนั้น ฉันจะทำให้ไอคอนนั้นนำคุณกลับไปที่หน้าจอก่อนหน้าได้อย่างไร
ในหลาย ๆ แอพ (ปฏิทิน, ไดรฟ์, Play Store) เมื่อคุณแตะปุ่มและเข้าสู่กิจกรรมใหม่ไอคอนในแถบชื่อเรื่องจะเปลี่ยนเป็นปุ่มย้อนกลับ แต่สำหรับแอปที่ฉันกำลังสร้างนั้นจะไม่ทำเช่นนั้น ฉันจะทำให้ไอคอนนั้นนำคุณกลับไปที่หน้าจอก่อนหน้าได้อย่างไร
คำตอบ:
มีสองขั้นตอนง่ายๆในการสร้างปุ่มย้อนกลับในแถบหัวเรื่อง:
ขั้นแรกทำให้ไอคอนแอปพลิเคชันสามารถคลิกได้โดยใช้รหัสต่อไปนี้ในกิจกรรมที่มีแถบหัวเรื่องที่คุณต้องการให้มีปุ่มย้อนกลับ:
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
หลังจากคุณเพิ่มรหัสด้านบนแล้วคุณจะเห็นลูกศรย้อนกลับปรากฏทางด้านซ้ายของไอคอนแอปพลิเคชัน
ประการที่สองหลังจากที่คุณดำเนินการข้างต้นแล้วคุณยังต้องสร้างโค้ดที่จะใช้ประโยชน์จากเหตุการณ์การคลิก ในการดำเนินการดังกล่าวโปรดทราบว่าเมื่อคุณคลิกที่ไอคอนแอปพลิเคชันจริงๆจะมีonOptionsItemSelected
การเรียกวิธีการ ดังนั้นหากต้องการกลับไปที่กิจกรรมก่อนหน้าให้เพิ่มวิธีการนั้นลงในกิจกรรมของคุณและใส่Intent
รหัสลงไปเพื่อให้คุณกลับสู่กิจกรรมก่อนหน้า ตัวอย่างเช่นสมมติว่ากิจกรรมที่คุณกำลังพยายามที่จะกลับไปMyActivity
เรียกว่า หากต้องการย้อนกลับไปให้เขียนวิธีการดังนี้:
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
แค่นั้นแหละ!
(ใน API นักพัฒนา Android แนะนำให้ยุ่งกับไฟล์ Manifest และเพิ่มสิ่งต่างๆเช่นandroid:parentActivityName
แต่ดูเหมือนจะไม่ได้ผลสำหรับฉันข้างต้นง่ายกว่าและเชื่อถือได้มากกว่า)
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
และในกิจกรรมของคุณ
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ใช้รหัสนี้
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
หลังจากนั้นเขียนโค้ดนี้ในonOptionsItemSelected
วิธีการ
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
}
getActionBar()
ทำให้ฉันเป็นโมฆะ คุณรู้ไหมว่าทำไม?
ในที่สุดฉันก็สามารถเพิ่มปุ่มย้อนกลับไปยังแถบการกระทำ / แถบเครื่องมือได้อย่างถูกต้อง
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
1.- เพิ่มกิจกรรมลงใน AndroidManifest.xml และตรวจสอบให้แน่ใจว่าได้ระบุข้อมูลเมตา:
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
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>
2.- เพิ่มรหัสต่อไปนี้ในวิธีการ onCreate ของกิจกรรม:
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
3.- แทนที่ onOptionsItemSelected และใช้ NavUtils.navigateUpFromSameTask () วิธีการแบบคงที่เพื่อนำทางโยนสแต็ก
@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);
}
อย่างไรก็ตามการใช้ navUpFromSameTask () จะเหมาะสมก็ต่อเมื่อแอปของคุณเป็นเจ้าของงานปัจจุบัน (นั่นคือผู้ใช้เริ่มงานนี้จากแอปของคุณ) หากไม่เป็นความจริงและกิจกรรมของคุณเริ่มต้นในงานที่เป็นของแอพอื่นการไปที่ขึ้นควรสร้างงานใหม่ที่เป็นของแอพของคุณซึ่งคุณต้องสร้างแบ็กสแตกใหม่
หากกิจกรรมของคุณขยายกิจกรรม
public class YourActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
หากการกระทำของคุณขยาย AppCompatActivity
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getSupportActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
ไม่มีอะไรต้องทำเพิ่มเติมดูเพิ่มการดำเนินการ
[ไม่บังคับ] หากต้องการกำหนดกิจกรรมหลักอย่างชัดเจนให้แก้ไข Manifest.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.YourActivity "
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>
โปรดดูระบุกิจกรรมหลัก
หากกิจกรรมของคุณขยายออกไปAppCompatActivity
คุณต้องลบล้างonSupportNavigateUp()
วิธีการดังนี้:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
...
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
จัดการตรรกะของคุณในonBackPressed()
วิธีการของคุณและเพียงแค่เรียกใช้วิธีonSupportNavigateUp()
นั้นเพื่อให้ปุ่มย้อนกลับบนโทรศัพท์และลูกศรบนแถบเครื่องมือทำสิ่งเดียวกัน
ก่อนอื่นในฟังก์ชัน onCreate ให้เพิ่มบรรทัดต่อไปนี้
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
จากนั้นเพิ่มฟังก์ชันต่อไปนี้ในโค้ด:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
ก่อนอื่นคุณต้องเขียนรหัสนี้
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
จากนั้นเพิ่มบรรทัดนี้ในไฟล์ Manifest
<activity android:name=".MainActivity"
android:parentActivityName=".PreviousActivity"></activity>
ฉันคิดว่ามันจะได้ผล
หากคุณใช้ไลบรารีการสนับสนุนใหม่สำหรับ 5.1 ใน android studio คุณสามารถใช้สิ่งนี้บน AppCompatActivity แทนได้
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
actionBar.setDisplayShowHomeEnabled(true);
ไชโย
วิธีที่ง่ายที่สุดและแนวทางปฏิบัติที่ดีที่สุดตามที่ Google อธิบายไว้ที่นี่ :
1. เพิ่มผู้ปกครองให้กับบุตรหลานของคุณกิจกรรมในAndroidManifest.xml
:
<activity
android:name=".ChildActivity"
android:parentActivityName=".ParentActivity" >
</activity>
2. เปิดใช้งานปุ่มย้อนกลับในบุตรหลานของคุณกิจกรรม:
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
ทำงานให้ฉันฉันหวังว่ามันจะเหมาะกับคุณเช่นกัน
หลังจากช่วงเวลาที่มีคุณภาพที่ฉันพบตัวเลือกธีมเป็นปัญหาหลักในโค้ดของฉันและต่อไปนี้เป็นวิธีที่เหมาะสมในการแสดงแถบเครื่องมือสำหรับฉัน
ในไฟล์ AndroidManifest ก่อนอื่นคุณต้องเปลี่ยนรูปแบบธีมของคุณ
Theme.AppCompat.Light.DarkActionBar
to
Theme.AppCompat.Light.NoActionBar
จากนั้นที่ xml กิจกรรมของคุณคุณต้องเรียก Toolbar ของคุณเองเช่น
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:elevation="4dp"/>
จากนั้นแถบเครื่องมือนี้ควรถูกเรียกในไฟล์ Java ของคุณโดย
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
และสำหรับแถบเครื่องมือที่แสดง U ควรตรวจสอบค่าว่างเพื่อหลีกเลี่ยง NullPointerException
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
สำหรับกิจกรรมที่บ้านกลับเพิ่มสิ่งนี้
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()==android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
หรือสำหรับกิจกรรมที่คุณต้องการกลับมา
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
ฉันเห็นคำตอบที่ซับซ้อนมากมายดังนั้นนี่คือรหัสของฉัน ทำงานที่นี่. คุณสามารถบรรลุเป้าหมายนี้ได้สองวิธี
1) ความเข้ากันได้ของ Android Stardard
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;
import android.view.MenuItem;
import android.view.View;
public class EditDiscoveryActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_discovery);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});*/
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
2) ใช้ไอคอนที่กำหนดเอง
หากคุณต้องการใช้โค้ดในความคิดเห็นคุณต้องเพิ่มไฟล์นี้ในรูปวาดที่เรียกว่า ic_arrow_white_24dp.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
ด้วยรหัสนี้
toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
หวังว่ามันจะช่วยบางคนที่นี่!
รุ่นที่มีน้ำหนักเบาโดยไม่ต้องใช้งานActionBarActivity
ที่ยังคงมีคุณสมบัติเหมือนกันที่นี่:
public class ToolbarConfigurer implements View.OnClickListener {
private Activity activity;
public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
toolbar.setTitle((this.activity = activity).getTitle());
if (!displayHomeAsUpEnabled) return;
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(this);
}
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(activity);
}
}
การใช้งาน: ใส่ในnew ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);
onCreate
คุณต้องเพิ่มรหัสที่กล่าวถึงด้านล่างในไฟล์รายการ ค้นหากิจกรรมที่คุณต้องการเพิ่มฟังก์ชันลูกศรย้อนกลับ หากคุณพบสิ่งที่ดีหรือสร้างกิจกรรม
<activity android:name=".SearchActivity">
</activity>
จากนั้นเพิ่มโค้ดสามบรรทัดต่อไปนี้ระหว่าง
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />
และอย่าลืมเพิ่มโค้ดส่วนนี้ใน onCreate (); วิธีการของกิจกรรมเฉพาะของคุณที่คุณต้องการลูกศรย้อนกลับ
Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
setSupportActionBar(toolbar);
try{
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}catch(NullPointerException e){
Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
}
นี่คือวิธีที่ฉันแก้ไขปัญหา ขอบคุณ.
คำตอบอื่น ๆ ไม่ได้ระบุว่าคุณสามารถตั้งค่านี้ใน XML ของToolbar
วิดเจ็ตของคุณ:
app:navigationIcon="?attr/homeAsUpIndicator"
ตัวอย่างเช่น:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/title_activity_acoustic_progress" />
สิ่งที่คุณต้องทำในปี 2020:
(หากคุณต้องการกลับไปที่ MainActivity)
protected void onCreate(Bundle savedInstanceState){
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
หากคุณใช้ ActionBar คุณจะต้องการอ่านเอกสารนี้ http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)
จากนั้นคุณต้องเขียนทับเมธอด onOptionsItemSelected (MenuItem) และมองหาเหตุการณ์ android.R.id.home ที่จะเข้ามาจากนั้นคุณจะรู้ว่าผู้ใช้คลิกที่ปุ่มย้อนกลับนั้นบนแถบการกระทำ
นอกจากนี้ยังสามารถทำได้โดยไม่ต้องใช้รหัสโดยระบุกิจกรรมหลักในรายการแอปหากคุณต้องการปุ่มย้อนกลับในกิจกรรม B ซึ่งจะไปที่กิจกรรม A เพียงเพิ่มกิจกรรม A เป็นแม่ของกิจกรรม B ในรายการ
สำหรับ kotlin:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}
ฉันต้องผสมคำตอบเพื่อให้ได้คำตอบที่ถูกต้องเพราะแอปของฉันมีกิจกรรม 3 อย่างที่สามารถย้อนกลับได้ตลอดเวลา กิจกรรม 1> กิจกรรม 2> กิจกรรม 3. เมื่อฉันทำบางอย่างใน activity3 ปุ่มย้อนกลับกำลังสำรองข้อมูลไปยัง Activity2 อย่างถูกต้อง อย่างไรก็ตามจาก Activity2 โดยใช้finish()
มันกลับไปที่ Activity3 ไม่ใช่ Activity1 และฉันกำลังขยาย AppCompatActivity ดังนั้นวิธีแก้ปัญหาของฉันคือ:
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setHomeButtonEnabled(true);
}
}
บน AndroidManifest.xml:
<activity android:name=".activities.Activity2"
android:parentActivityName="com.example.appname.activities.Activity1">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.appname.activities.Activity1" />
</activity>
และสุดท้ายปุ่มการทำงานบนเมนูของฉัน (แถบการกระทำ):
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
...
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
ใช้ทำงานให้ฉันแทนNavUtils.navigateUpFromSameTask(this);
finish()
แค่แบ่งปันสิ่งที่ช่วยฉันและอาจเป็นประโยชน์สำหรับคนอื่น ๆ แม้ว่าคำตอบส่วนใหญ่จะถูกต้อง แต่การใช้คำตอบgetActionBar().setDisplayHomeAsUpEnabled(true);
นี้ไม่ได้ผลสำหรับฉัน ปัญหาที่ฉันพบคือฉันพยายามสร้างกิจกรรมที่สองด้วยตนเอง แต่มีรายละเอียดเพิ่มเติมที่เกี่ยวข้อง
สิ่งที่ช่วยแก้ปัญหาของฉันได้จริงๆคือทำตามบทช่วยสอนนักพัฒนา Android ( https://developer.android.com/training/basics/firstapp/starting-activity ) สำหรับการสร้างกิจกรรมที่สองโดยใช้เครื่องมือของ Android Studio:
Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
คุณยังสามารถใส่onBackPressed()
ฟัง onClick ของคุณได้ สิ่งนี้ทำให้ปุ่มของคุณทำหน้าที่เหมือนปุ่ม "สำรองข้อมูล" เริ่มต้นในแอป Android!
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (getSupportActionBar()==null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
สิ่งนี้ใช้ได้ผลสำหรับฉัน .. สมมติว่ามีสองกิจกรรม (Activityone, Activitytwo)
ภายในกิจกรรมสองใช้รหัสนี้
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
บน Activityone
//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));
สิ่งนี้ควรรวมอยู่ในกิจกรรมที่สองภายในไฟล์รายการ
<activity android:name=".Activitytwo"
android:parentActivityName=".Activityone"></activity>
และผลลัพธ์ก็จะเป็นเช่นนี้
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.YourxmlFileName);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
return true;
}
return false;
}
นี่ใช้งานได้กับฉัน getSupportActionBar (). setDisplayHomeAsUpEnabled (false); ป้อนคำอธิบายภาพที่นี่