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);에서 onCreate와 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
내 상황에서 나는 돌아올 때 부모의 onCreate를 호출하지 않는 방법을 찾고있었습니다. 이를 위해 구현을 사용했지만 NavUtils.navigateUpFromSameTask (this) 대신 finish ()를 호출했습니다. finish ()는 onCreate 대신 내 onStart를 호출하여 더 이상적입니다.
Jon

매니페스트에 메타 데이터를 설정하면 탐색 버튼을 작동 할 수있는 열쇠입니다
VSB

getActionBar().setDisplayHomeAsUpEnabled(true);지원 라이브러리를 사용하는 경우에 사용 하십시오 .
Abhinav Upadhyay

"와이프"방향을 어떻게 변경합니까? 기본적으로이 뒤로 탐색을 구현하면 화면이 오른쪽에서 왼쪽으로 스윕되고 새 화면을로드하는 것처럼 보입니다. 그러나 장치 자체의 백 키를 누르는 것처럼 왼쪽에서 오른쪽으로 닦기를 원합니다.
stingray_

오류가 발생했습니다. 원인 : java.lang.NullPointerException : null 객체 참조에서 가상 메소드 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)'을 호출하려고 시도했습니다.
Jones

166

활동에서 ActionBar 홈 단추가 사용 가능한지 확인하십시오.

안드로이드, API 5+ :

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

ActionBarSherlock 및 App-Compat, API 7+ :

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

안드로이드, 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);
        }
    }
}

이런 식으로 원하는 모든 활동에 백 프레스를 적용 할 수 있습니다.

안드로이드, 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 (true);를 변경하면 나에게 도움이됩니다. getActionBar (). setDisplayHomeAsUpEnabled (true);에 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()은 null을 반환합니다. 따라서 ActionBar가 먼저 있는지 확인하십시오.

다음 단계는 android:parentActivityName뒤로 버튼을 누르면 탐색하려는 활동 으로 설정하는 것입니다. 이것도 역시해야합니다 AndroidManifest.xml.

이제 onCreate"자식"활동 방법 에서 뒤로 단추를 사용할 수 있습니다 .

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

이제 뒤로 버튼의 논리를 구현해야합니다. 단순히 onOptionsItemSelected"자식"활동 의 메소드 를 대체하고 뒤로 단추의 ID 인를 확인하십시오 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

툴바를 사용하는 경우 동일한 문제가 발생했습니다. 이 두 단계를 따라 해결했습니다.

  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 단계 : Child Activity에서 Parent Activity로 돌아와야하는 경우 Child Activity에이 코드를 제공하면됩니다.

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

0

Jared의 답변을 바탕으로 여러 활동에서 작업 표시 줄 뒤로 버튼 동작을 활성화하고 구현해야했으며 코드 중복을 줄이기 위해이 도우미 클래스를 만들었습니다.

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.