Android-제목 표시 줄의 뒤로 버튼


111

많은 앱 (캘린더, 드라이브, Play 스토어)에서 버튼을 탭하고 새로운 활동을 입력하면 제목 표시 줄의 아이콘이 뒤로 버튼으로 바뀌지 만 제가 만들고있는 앱에서는 그렇게하지 않습니다. 이 아이콘을 어떻게 이전 화면으로 되돌릴 수 있습니까?


여기에서 OnCreate 예에 getSupportActionBar ()를 시도 freakyjolly.com/how-to-add-back-arrow-in-android-activity
코드 스파이

답변:


145

제목 표시 줄에 뒤로 버튼을 만드는 간단한 두 단계가 있습니다.

먼저 제목 표시 줄에 뒤로 버튼을 추가하려는 활동에서 다음 코드를 사용하여 애플리케이션 아이콘을 클릭 할 수 있도록합니다.

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:parentActivityName. 과 같은 것들을 추가 할 것을 권장 합니다.하지만 그것은 저에게 효과가없는 것 같습니다. 위의 내용은 더 간단하고 신뢰할 수 있습니다.)

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

그리고 당신의 활동에서

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
당신은 잘 설명했지만 onOptionItemSelected에서 잘못되지 않았다면 finish (); 귀하의 경우에 startActivityForResult 두 번째 활동을 시작하고 당신이 두 번째 활동에서 다시 누를 때 먼저 활동에 다시 던져 질 것이다 (여기서 요 프레스 작업 표시 줄 아이콘)
야야 아르 샤드

8
또한 item.getItemId ()가 android.R.id.home 인 경우에만이를 수행해야합니다.
bitek

2
AS 상태 : "Method 호출 'actionBar.setDisplayHomeAsUpEnabled (true)'는 java.lang.NullPointerException을 생성 할 수 있습니다."
statosdotcom

1
경고! ToolBar를 사용하면 actionBar가 크래시와 함께 null을 반환합니다. 아래 답변을 참조하십시오.
CoolMind

5
getActionBar ()가 작동하지 않았고 앱이 충돌합니다. getSupportActionBar ()가 작동했습니다.
john ktejik

60

이 코드를 사용

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

그 후이 코드를 onOptionsItemSelected메소드에 작성하십시오.

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

1
getActionBar()나에게 null을 준다. 왜 그런지 알아?
msysmilu 2015 년

3
< "windowActionBar 안드로이드"항목 이름 => 거짓 </ 항목> <항목 이름 = "안드로이드 : windowNoTitle"> 진정한 </ 항목> 스타일 액션 바, 예를 들어 없기 때문에
폴 Verest

47

마침내 액션 바 / 툴바에 뒤로 버튼을 제대로 추가했습니다.

@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;
}

3
이것은 나를 위해 일하는 유일한 대답입니다. @LucyFair 감사합니다
Arda Çebi

2
같은. 답변 주셔서 감사합니다.
Maria는

같은. 다른 답변은 작동하지 않습니다. 이것은 받아 들여진 대답이어야합니다.
El Sushiboi

18

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);
}

그러나 navigateUpFromSameTask () 사용은 앱이 현재 작업의 소유자 인 경우에만 적합합니다 (즉, 사용자가 앱에서이 작업을 시작 함). 이것이 사실이 아니고 활동이 다른 앱에 속한 작업에서 시작된 경우 Up으로 이동하면 앱에 속하는 새 작업이 생성되어야하며,이 경우 새 백 스택을 생성해야합니다.


NavUtils를 소개해 주셔서 감사합니다!
AntonSack

10

활동이 활동을 확장하는 경우

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>

상위 활동 지정을 참조하십시오.


1
이것이 제가 정확히 찾고 있던 것입니다. 당신은 내 하루를 구했습니다. 감사합니다.
Tashi Dendup

6

활동이 확장되면 다음 과 같이 메서드 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()하면 전화기의 뒤로 단추와 도구 모음의 화살표가 동일한 작업을 수행합니다.


6

우선 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);
    }

6

먼저이 코드를 작성해야합니다.

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

그런 다음 매니페스트에이 줄을 추가합니다.

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

나는 그것이 작동 할 것이라고 생각한다


5

Android 스튜디오에서 5.1 용 새 지원 라이브러리를 사용하는 경우 대신 AppCompatActivity에서 사용할 수 있습니다.

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

건배.


5

Google 이 여기에서 설명하는 가장 간단한 방법과 모범 사례 .

1. 다음에서 childActivity의 부모를 추가합니다 AndroidManifest.xml.

<activity 
        android:name=".ChildActivity"
        android:parentActivityName=".ParentActivity" >
</activity>

2. childActivity에서 뒤로 버튼을 활성화합니다.

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

나를 위해 일했고, 당신에게도 효과가 있기를 바랍니다.


이것은 활동이 하나의 상위 활동 만 가질 수있는 경우에만 유효합니다. 그게 제 경우입니다. +1
MQoder 2017 년

제 경우에는 2 단계가 필요하지 않았습니다.
Thomio

5

내가 찾은 좋은 시간이 지나면 테마 옵션이 내 코드의 주요 문제이며 다음은 도구 모음을 표시하는 적절한 방법입니다.

AndroidManifest 파일에서 먼저 테마 스타일을 변경해야합니다.

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

그런 다음 활동 xml에서 다음과 같이 자신의 툴바를 호출해야합니다.

<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을 피하기 위해 null을 확인해야합니다.

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;
}

3

나는 너무 많은 콤플렉스가 대답하는 것을 보았으므로 이것이 내 코드입니다. 여기서 일 해요. 두 가지 방법으로이를 달성 할 수 있습니다.

1) 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();
                }
            });

여기 일부 사람들에게 도움이되기를 바랍니다!


2

사용하지 않는 경량 버전 ActionBarActivity은 여전히 ​​여기에 동일한 bahaviors가 있습니다.

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.


이는 지원 라이브러리에 포함 된 새로운 툴바 위젯에 적합합니다. 감사!!
Clocker

2

매니페스트 파일에 아래 언급 된 코드를 추가해야합니다. 뒤로 화살표 기능을 추가 할 활동을 검색합니다. 하나를 찾으면 괜찮거나 활동을 만드십시오.

<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");
    }

이것이 제가 문제를 해결 한 방법입니다. 감사.


2

다른 답변은 Toolbar위젯 의 XML에서도 설정할 수 있다고 언급하지 않습니다 .

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" />

2

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;
}

흥미롭지 만 MainActivity로 돌아가고 싶다고 가정하고 있습니다. 이전 활동으로 어떻게 리디렉션 하시겠습니까?
mayid


1

앱 매니페스트에서 상위 활동을 지정하여 코드 없이도 수행 할 수 있습니다. 활동 A로 이동할 활동 B의 뒤로 버튼을 원하는 경우 매니페스트에서 활동 B의 부모로 활동 A를 추가하면됩니다.


1

kotlin의 경우 :

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }

1

내 앱에는 언제든지 돌아가고 돌아갈 수있는 3 가지 활동이 있기 때문에 올바른 답을 얻기 위해 몇 가지 답변을 혼합해야했습니다. 활동 1> 활동 2> 활동 3. 내 activity3에서 뭔가를 할 때 뒤로 버튼이 Activity2로 올바르게 백업되었습니다. 그러나 Activity2에서를 사용 finish()하면 Activity1이 아닌 Activity3으로 돌아갑니다. 그리고 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().


1

나를 도왔고 다른 사람들에게 유용 할 수있는 것을 공유하는 것뿐입니다. 여기에있는 대부분의 답변은 정확하지만을 사용하면 getActionBar().setDisplayHomeAsUpEnabled(true);저에게 효과적 이지 않았습니다. 내가 가진 문제는 수동으로 두 번째 활동을 만들려고했지만 더 자세한 내용이 관련되어 있다는 것입니다.
내 문제를 실제로 해결 한 것은 Android Studio 자체 도구를 사용하여 두 번째 활동을 만들기위한 Android 개발자 자습서 ( https://developer.android.com/training/basics/firstapp/starting-activity )를 따르는 것이 었습니다 .

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.

0

단순히 onBackPressed()onClick 리스너 를 넣을 수도 있습니다 . 이렇게하면 버튼이 Android 앱의 기본 "백업 / 업"버튼처럼 작동합니다!


0
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);
}

0

이것은 나를 위해 일하고 있습니다 .. 두 개의 활동이 있다고 가정하십시오 (Activityone, Activitytwo)

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>

결과는 다음과 같습니다.

여기에 이미지 설명 입력


0
  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;
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.