안드로이드에서 액션 바 뒤로 버튼을 재정의하는 방법은 무엇입니까?


95

하드 키 뒤로 버튼이 아닌 작업 표시 줄에서 활동 뒤로 버튼을 사용자 정의하고 싶습니다. onBackPressed()방법 을 재정의했습니다 . 내 에뮬레이터 뒤로 버튼에서는 작동하지만 작업 모음 뒤로 버튼에서는 작동하지 않습니다.

나는 그것이 액션 바에서 일어나기를 원합니다. 어떻게 할 수 있습니까?

내 코드는 다음과 같습니다.

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

뒤로 누름이 작동하는지 여부에 관계 없이이 토스트를 사용했지만 실제 구현 변경은 이전 활동으로 돌아가는 것과 같습니다. 그러나 이것은 작업 표시 줄 위에있는 버튼 (활동 제목 옆에 있음)에서는 작동하지 않습니다.

누구든지 나에게 문제를 지정할 수 있습니다.

답변:


209

홈 버튼 클릭 조작을 무시하고 싶다고 생각합니다. 활동에서 이와 같이이 기능을 재정의 할 수 있습니다.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

1
Noah Ibrahim, 사실 브라우저의 뒤로 버튼과 같이 왼쪽 상단 모서리에 뒤로 버튼이 있습니다. 이 버튼을 클릭하면 이전 활동으로 돌아가고 싶습니다. 위에 게시 한 코드와는 다릅니다.
GK

4
추가 super.onBackPressed (); 그것에
redestructa jul.

2
내가 변경 한 후이 나를 위해 일 return true;return super.onOptionsItemSelected(item). 그런 다음 사용자가 작업 표시 줄 뒤로 버튼을 클릭 할 때 어떤 일이 발생하도록 할 수 있지만 버튼의 동일한 기능은 그대로 유지합니다.
kumaheiyama

이 기술을 사용하면 뒤로 화살표 버튼이 늦게 응답합니다. 이벤트가 시작될 때까지 잠시 기다려야 함을 의미합니다. 를 누른 상태에서 또한 영향이 버튼에 선택을 표시하지
고팔 싱 Sirvi

나를 위해 일하지 않았다. 디버깅했을 때 홈 버튼의 ID와 버튼의 ID가 다른 것을 발견했습니다.
독사

45

ActionBar 뒤로 버튼이 하드웨어 뒤로 버튼과 동일한 방식으로 작동하도록하려면 :

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

1
사건 android.R.id.home이 발사되지 않음
Trancer

2
@Trancer setHasOptionsMenu(true)프래그먼트에서 사용한다면 프래그먼트의 onCreate 메소드를 추가로 호출해야합니다
wilddev

10

사용자가 뒤로 버튼을 누르거나 작업 표시 줄 홈 버튼을 누를 수 있다는 점에 유의해야합니다.
따라서 그를 동일한 목적지로 리디렉션하려면 이렇게 할 수 있습니다.

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

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

그러면 사용자가 키 또는 작업 표시 줄 버튼을 누르는 의도로 이동합니다.


사건 android.R.id.home이 발사되지 않음
Trancer

@Trancer, 거의 1.5 년이 넘었습니다. 그리고 나는 지금 안드로이드를하지 않는다. 지금은 도와 드릴 수 없습니다. 죄송합니다.
ssi-anik

그래서 해결책은 무엇입니까?
GA1 2017-10-24

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

2
주석으로 추가 할 수 있습니다. 받아 들여지는 대답과 다소 동일합니다.
Sufian 2014 년

7

죄송합니다 내 답변이 늦었지만 같은 질문 으로이 페이지에 도착하는 다른 사람을 위해 위의 방법을 시도했습니다.

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

그러나 이것은 "뒤로"버튼 누름을 포착하지 못했습니다.

결국 "AppCompatActivity"지원 라이브러리의 작업 표시 줄을 사용하면서 "onSupportNavigateUp ()"을 재정의하는 https://stackoverflow.com/a/37185334/3697478 에서 저에게 도움이되는 방법을 찾았습니다 . (최신 액션 바 / 툴바 라이브러리에 해당하는 "onNavigateUp ()"이 있습니다.)

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

매니페스트 파일에서 "android : parentActivityName =". MainActivity "섹션을 제거했습니다.


4

두 단계 만 사용하여이를 달성했습니다.

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

2

다시 생성 하지 않고 ActionBar 홈 버튼을 눌러 Activity이전 인스턴스 로 돌아가려면 getParentActivityIntent 메서드를 재정 의하여 백 스택의 인스턴스 를 사용할 수 있습니다.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

편집 :
또한 부모 활동
launchModesingleTop 으로 설정하여 동일한 결과를 얻을 수 있습니다 .
그래서 설정android:launchMode="singleTop" 매니페스트에서 부모 활동으로 하십시오.
또는 UP 인 텐트와 함께 FLAG_ACTIVITY_CLEAR_TOP 플래그를 사용할 수 있습니다.
참조 : 위로 탐색 제공


2

(1) 자녀 활동에 대한 부모 활동 추가 (AndroidManifest.xml)

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

(2) 자식 활동 내에서 onSupportNavigateUp 메서드 재정의

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

0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

바에서 뒤로 버튼을 설정하는 방법에는 여러 가지가 있습니다.

1) 메서드 .setDisplayHomeAsUpEnabled(true);가 수행 한 다음 간단히 재정의 할 수 있습니다.android.R.id.home

2) <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />Android Manifest에 추가 하지만이 경우 OnOptionsMenuSelected에서 재정의 할 수 없습니다android.R.id.home .

.. 왜 그것이 그들에게 효과가 없는지 궁금한 사람들을 위해 ...

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