8

Ho un layout del cassetto come layout di base della mia attività e sto sostituendo due frammenti su un frame presente all'interno di questo layout del cassetto. Il primo frammento non viene aggiunto nello stack posteriore del frammento. Sto visualizzando l'icona dell'hamburger nella mia attività (voglio anche il menu del cassetto nel mio primo frammento). Nel secondo frammento ho disabilitato l'icona dell'hamburger tramite mActionBarDrawerToggle.setDrawerIndicatorEnabled(false) e attivato il pulsante indietro utilizzando actionBar.setDisplayHomeAsUpEnabled(true).Navigazione verso l'alto (la freccia indietro della barra delle azioni) non funziona per i frammenti

Nei primi frammenti onResume Ho attivato icona hamburger da mActionBarDrawerToggle.setDrawerIndicatorEnabled (true) `in modo che quando l'utente preme il pulsante posteriore (hardware e tasti su di azione-bar) dal secondo frammento, utente tornerà a primo frammento e hamburger l'icona sarà abilitata. Tutto funziona bene solo non riesco a tornare indietro dal secondo pulsante della barra delle azioni. Non sono in grado di fare clic. Qui di seguito è il mio codice: -

Codice attività

if (Utility.isLargeScreen(this)) 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    else 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    mHiddenGemsApplication = (HiddenGemsApplication) getApplication(); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    initViews(); 

    setSupportActionBar(mToolbar); 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
    mTextViewActionBarTitle.setText(getString(R.string.app_name)); 

    mActionBarDrawerToggle = new ActionBarDrawerToggle(HomeActivity.this, mDrawerLayout, mToolbar, R.string.open_drawer, R.string.close_drawer) { 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); 

    mActionBarDrawerToggle.syncState(); 

    mFragmentManager = getSupportFragmentManager(); 

    replaceFragment(new CategoryFragment(), getString(R.string.app_name), CategoryFragment.TAG); 

@Override 
public void onBackPressed() { 

    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
     mDrawerLayout.closeDrawers(); 
     return; 
    } 
    super.onBackPressed(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case android.R.id.home: 
      if (mFragmentManager.getBackStackEntryCount() > 0) { 
       mFragmentManager.popBackStack(); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

public void replaceFragment(Fragment fragment, String actionBarTitle, String tag) { 

    if (mFragmentManager == null) 
     return; 

    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.content_frame, fragment, tag); 
    if (!tag.equals(CategoryFragment.TAG)) 
     fragmentTransaction.addToBackStack(tag); 
    fragmentTransaction.commit(); 

    setActionBarTitle(actionBarTitle); 
} 

public void setActionBarTitle(String actionBarTitle) { 
    if (!TextUtils.isEmpty(actionBarTitle)) 
     mTextViewActionBarTitle.setText(actionBarTitle); 
} 

public void setDrawerIndicatorEnabled(boolean value) { 
    if (mActionBarDrawerToggle != null) { 
     mActionBarDrawerToggle.setDrawerIndicatorEnabled(value); 
    } 
} 

XML Activity

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="nirvaniclabs.com.hiddengems.activities.HomeActivity"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <include 
     android:id="@+id/toolbarlayout" 
     layout="@layout/toolbar_layout" /> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/toolbarlayout" /> 
</RelativeLayout> 

<android.support.design.widget.NavigationView 
    android:id="@+id/navigation" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:menu="@menu/navigation_items" /> 

</android.support.v4.widget.DrawerLayout> 

primo frammento: -

private Button mButtonTemp; 
private AppCompatActivity mActivity; 
public static String TAG = "CategoryFragment"; 

public CategoryFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    if (context instanceof Activity) 
     mActivity = (AppCompatActivity) context; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View viewGroup = inflater.inflate(R.layout.fragment_category, container, false); 
    initViews(viewGroup); 

    mButtonTemp.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      ((HomeActivity) mActivity).replaceFragment(new TripListFragment(), "Trip Fragment", TripListFragment.TAG); 
     } 
    }); 

    return viewGroup; 
} 

private void initViews(View viewGroup) { 
    mButtonTemp = (Button) viewGroup.findViewById(R.id.btn_temp); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    ((HomeActivity) mActivity).setDrawerIndicatorEnabled(true); 
    ((HomeActivity) mActivity).setActionBarTitle(getString(R.string.app_name)); 
} 

secondo frammento

private AppCompatActivity mActivity; 
public static String TAG = "TripListFragment"; 

public TripListFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Activity) 
     mActivity = (AppCompatActivity) context; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setHasOptionsMenu(true); 
    ActionBar actionBar = mActivity.getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_trip_list, container, false); 
} 


@Override 
public void onResume() { 
    super.onResume(); 
    ((HomeActivity) mActivity).setDrawerIndicatorEnabled(false); 
} 

Inoltre, quando sono in secondo frammento sono in grado di strisciare e vedere il menu cassetto. Non voglio questo comportamento, il menu del cassetto dovrebbe essere aperto solo nel frammento 1.

Se qualcosa nel mio codice non è corretto, fatemelo sapere.

+2

puoi fare un piccolo diagramma sul tuo flusso di lavoro? –

+0

Mi chiedevo se potessi, per favore, aiutarmi un po '. Non riesco a visualizzare il pulsante Indietro quando cambio frammenti. Puoi fornire i tuoi layout "toolbar_layout" e "navigation_items" in modo da poter vedere come far funzionare un layout che supporterà i pulsanti indietro durante il passaggio dei frammenti. Grazie –

risposta

13

Finalmente ho la risposta. Nel mio scenario sto disabilitando l'indicatore del cassetto di mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); ea causa di questa icona di navigazione i clic sono disabilitati. Per abilitarlo devo aggiungere ToolbarNavigationClickListener a ActionBarDrawerToggle che abiliterà i clic sull'icona di navigazione.

riportano di seguito le mio codice di lavoro: -

mActionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 

Refer this link for more clarification

2

Dopo aver lottato con lo stesso problema per le età, alla fine ho riuscito ad ottenere il pulsante Su di lavorare in frammenti con questo codice. È necessario disporre di setHasOptionsMenu istituito nel onCreate() o onCreateView()

setHasOptionsMenu(true); 

Poi, in onOptionsItemSelected() aggiungere questo controllo per il tasto su/home essere pressato allo switch() [o se ... ] dichiarazione:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    x.L(); 

    switch (item.getItemId()) { 
     case android.R.id.home : 
      getActivity().onBackPressed(); 

      break; 

     case R.id.mn_exit : 
      exitFragment(); 

      break; 

     default : 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 
Problemi correlati