A , B , C 라는 세 개의 탭이있는 탭이있는 Actionbar / viewpager 레이아웃이 있습니다. 탭에서 C의 탭 (조각), 나는 또 다른 조각 말 조각 추가하고 D를 . 와
DFragment f= new DFragment();
ft.add(android.R.id.content, f, "");
ft.remove(CFragment.this);
ft.addToBackStack(null);
ft.commit();
DFragment의 onResume에서 액션 바를 수정하여 버튼을 추가합니다.
ActionBar ab = getActivity().getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
ab.setDisplayHomeAsUpEnabled(true);
ab.setDisplayShowHomeEnabled(true);
이제 DFragment에서 하드웨어 (전화) 뒤로 버튼을 누르면 CFragment가 선택된 원래 Tabbed (ABC) 레이아웃으로 돌아갑니다. 액션 바 업 버튼으로이 기능을 어떻게 달성 할 수 있습니까?
답변
OnBackStackChangedListener
이 코드를 구현 하고 조각 활동에 추가합니다.
@Override
public void onCreate(Bundle savedInstanceState) {
//Listen for changes in the back stack
getSupportFragmentManager().addOnBackStackChangedListener(this);
//Handle when activity is recreated like on orientation Change
shouldDisplayHomeUp();
}
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
public void shouldDisplayHomeUp(){
//Enable Up button only if there are entries in the back stack
boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount()>0;
getSupportActionBar().setDisplayHomeAsUpEnabled(canGoBack);
}
@Override
public boolean onSupportNavigateUp() {
//This method is called when the up button is pressed. Just the pop back stack.
getSupportFragmentManager().popBackStack();
return true;
}
답변
알았어. 단지 오버라이드 (override) onOptionsItemSelected을 활동을 주최하고, 예를 들면 가기 backstack 팝업
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return true;
}
break;
}
}
return super.onOptionsItemSelected(item);
}
전화 getActionBar().setDisplayHomeAsUpEnabled(boolean);
와 getActionBar().setHomeButtonEnabled(boolean);
의 onBackStackChanged()
아래 답변에 설명 된대로.
답변
상위 활동이 하나 있고이 위로 버튼이 뒤로 버튼으로 작동하도록하려면 다음 코드를 사용할 수 있습니다.
이것을 기본 활동 클래스의 onCreate에 추가하십시오.
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment)
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
}
}
});
다음과 같이 onOptionsItemSelected를 추가하십시오.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
....
}
나는 일반적으로 이것을 항상 사용하고 꽤 합법적 인 것 같습니다
답변
뒤로 버튼과 같은 위로 버튼으로 돌아갈 수 있습니다.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
답변
나는이 질문이 오래되었다는 것을 알고 있지만 (나 같은) 누군가도 그것을 필요로 할 수 있습니다.
활동이 AppCompatActivity를 확장 하는 경우 더 간단한 (2 단계) 솔루션을 사용할 수 있습니다.
1-홈이 아닌 프래그먼트를 추가 할 때마다 프래그먼트 트랜잭션을 커밋 한 직후 up 버튼 만 표시됩니다. 이렇게 :
// ... add a fragment
// Commit the transaction
transaction.commit();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
2-UP 버튼을 누르면 숨 깁니다.
@Override
public boolean onSupportNavigateUp() {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
return true;
}
그게 다야.
답변
Roger Garzon Nieto 와 sohailaziz의 답변을 조합하여 사용했습니다 . 내 앱에는 단일 MainActivity와 여기에로드 된 조각 A, B, C가 있습니다. 내 “홈”조각 (A)은 OnBackStackChangedListener를 구현하고 backStack의 크기를 확인합니다. 1보다 작 으면 UP 버튼을 숨 깁니다. 조각 B와 C는 항상 뒤로 버튼을로드합니다 (제 디자인에서 B는 A에서 시작되고 C는 B에서 시작됨). MainActivity 자체는 UP 버튼 탭에서 백 스택을 팝하고 프래그먼트가 호출하는 버튼을 표시하거나 숨기는 메서드가 있습니다.
주요 활동:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
}
return super.onOptionsItemSelected(item);
}
public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }
fragmentA (FragmentManager.OnBackStackChangedListener 구현) :
public void onCreate(Bundle savedinstanceSate) {
// listen to backstack changes
getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);
// other fragment init stuff
...
}
public void onBackStackChanged() {
// enable Up button only if there are entries on the backstack
if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
((MainActivity)getActivity()).hideUpButton();
}
}
fragmentB, fragmentC :
public void onCreate(Bundle savedinstanceSate) {
// show the UP button
((MainActivity)getActivity()).showUpButton();
// other fragment init stuff
...
}
답변
이것은 나를 위해 일했습니다. 예를 들어 (Kotlin의 코드) onSupportNavigateUp 및 onBackPressed를 재정의합니다.
override fun onBackPressed() {
val count = supportFragmentManager.backStackEntryCount
if (count == 0) {
super.onBackPressed()
} else {
supportFragmentManager.popBackStack()
}
}
override fun onSupportNavigateUp(): Boolean {
super.onSupportNavigateUp()
onBackPressed()
return true
}
이제 조각에서 위쪽 화살표를 표시하면
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
클릭하면 이전 활동으로 돌아갑니다.