2016-12-29 2 views
0

Моя проблема примерно такая же, как this. Я работаю в Skobbler map. У меня есть MainActivity которые включают HomeFragment. Мой HomeFragement включает в себя stack of view: A->B->C->D. Когда я доберусь до view D, если я back press, то я хочу вернуться, как: D->-C->B->A.Назад Нажмите для просмотра В фрагменте

В моей MainActivity я включил метод Fragment в onCreate:

homeFragment = HomeFragment.newInstance(); 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.llMainActivityContainer, homeFragment) 
      .addToBackStack(TAG) 
      .commit(); 

и

@Override 
public void onBackPressed() { 
    if (!homeFragment.onBackPressed()) { 
     int count = getSupportFragmentManager().getBackStackEntryCount(); 
     if (count > 0) { 
      getSupportFragmentManager().popBackStack(); 
      return; 
     } 
     super.onBackPressed(); 
    } 
} 

В моей HomeFragment, у меня есть onBackPress метод.

public boolean onBackPressed() {} 

Но я не могу вернуться из final view в first view as homescreen. Что мне здесь включить? Что можно сделать для решения этой проблемы?

Доп.код

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/rlHomeContainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:animateLayoutChanges="true"> 


<com.skobbler.ngx.map.SKMapViewHolder 
    android:id="@+id/skmVHHome" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<RelativeLayout 
    android:id="@+id/chess_board_background" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/map_background" /> 

<include layout="@layout/layout_driving_direction_info" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fabDrivingDirections" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/fabCurrentLoc" 
    android:layout_alignParentRight="true" 
    android:layout_marginBottom="16dp" 
    android:layout_marginRight="@dimen/activity_horizontal_margin" 
    app:backgroundTint="@color/blue_panel_day_background" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fabCurrentLoc" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:layout_marginBottom="150dp" 
    android:layout_marginRight="@dimen/activity_horizontal_margin" 
    app:backgroundTint="@color/blue_panel_day_background" /> 


<include 
    layout="@layout/layout_drive_info" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" /> 


</RelativeLayout> 
+0

Что такое комплект TAG? –

+0

Можете ли вы добавить больше о стеке обзора? –

+0

TAG ничего, 'addToBackStack (строка здесь)', поэтому я добавляю это? Что я могу добавить туда? –

ответ

1

Он чувствует, как Google пропустил эту часть при проектировании классов фрагментов для таблеток. Фрагменты могут заинтересоваться обработкой кнопки «Назад», но они не получают никакого обратного вызова, чтобы сообщить им, что нажата кнопка «Назад».

Вот как я решил эту проблему.

  • Определить интерфейс. Я сделал это как внутренний интерфейс действия, так как это действие, которое обращается к тем клиентам, которые его реализуют.

    public interface HandlesOnBackPressed { 
    
         /** 
         * Callback for back button pressed event. 
         * @return true if the back press was handled so the activity doesn't need to. 
         */ 
         boolean onBackPressed(); 
        } 
    
  • Фрагменты, которые имеют интерес к задней кнопки будет реализовывать этот интерфейс

    public class MyFragment extends Fragment implements MyActivity.HandlesOnBackPressed { 
    
        ... 
    
        @Override 
        public boolean onBackPressed() { 
    
         ... 
    
  • Когда вы делаете сделку фрагмент:

    1. Дайте HandlesOnBackPressed фрагмент, уникальный тег когда вы совершаете транзакцию (replace и т. д.)
    2. Когда вы нажимаете транзакцию на задний стек, дайте этой записи в стеке те же теги.

      MyFragment fragment = MyFragment.newInstance(... 
          fragmentManager 
            .beginTransaction() 
            .replace(R.id.fragment_container, fragment, "MyFragment") 
            .addToBackStack("MyFragment") 
            .commit(); 
      

    Тот факт, что я использовал имя класса не имеет никакого отношения к логике. Единственным требованием является то, что тег фрагмента и тег записи предыдущего стека совпадают.

  • И вот секретный соус.Override onBackPressed в деятельности:

    @Override 
        public void onBackPressed() { 
    
         FragmentManager fragmentManager = getSupportFragmentManager(); 
         int count = fragmentManager.getBackStackEntryCount(); 
         if (count > 0) { 
    
          FragmentManager.BackStackEntry topBackStackEntry = fragmentManager.getBackStackEntryAt(count - 1); 
          if (topBackStackEntry != null) { 
    
           String tag = topBackStackEntry.getName(); 
           if (tag != null) { 
    
            // since super.onBackPressed() hasn't been called yet, 
            // the top back stack entry should match with the current fragment 
            Fragment fragment = fragmentManager.findFragmentByTag(tag); 
            if (fragment instanceof HandlesOnBackPressed) { 
    
             if (((HandlesOnBackPressed) fragment).onBackPressed()) { 
    
              // the fragment handled the back press, 
              // so don't call super.onBackPressed() 
              return; 
             } 
            } 
           } 
          } 
         } 
    
         DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
         if (drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.START)) { 
          drawerLayout.closeDrawer(GravityCompat.START); 
         } else { 
          super.onBackPressed(); // pops back stack, onBackStackChanged() is called 
         } 
    
        } 
    

Google, почему вы меня сделать этот материал?