8

Ich habe ein Schubladenlayout als Basislayout meiner Aktivität und ersetze zwei Fragmente auf einem Rahmen, der in diesem Schubladenlayout vorhanden ist. Das erste Fragment wird nicht im Backstack des Fragments hinzugefügt. Ich zeige ein Hamburger-Icon in meiner Aktivität an (ich möchte auch das Schubladenmenü in meinem ersten Fragment). Im zweiten Fragment deaktivierte ich das Hamburger-Icon durch mActionBarDrawerToggle.setDrawerIndicatorEnabled(false) und aktivierte die Zurück-Taste unter Verwendung von actionBar.setDisplayHomeAsUpEnabled(true).Navigation nach oben (Rückwärts-Pfeil auf der Aktionsleiste) funktioniert nicht für Fragmente

In ersten Fragmenten OnResume aktivierte ich Hamburger-Symbol von mActionBarDrawerToggle.setDrawerIndicatorEnabled (true) `so, wenn der Benutzer zurück-Taste (sowohl Hardware und Aktion-Bar-Up-Taste) aus zweiten Fragment, Benutzer wird zurück zu ersten Fragment und Hamburger Das Symbol wird aktiviert. Alles funktioniert gut nur ich bin nicht in der Lage, von der zweiten Fragmenten Action Bar zurück Knopf zu gehen. Ich kann es nicht anklicken. Unten ist mein Code: -

Aktivität Code

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

Aktivität XML

<?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> 

Erster Teil: -

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

Zweiter Teil

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

Auch, wenn ich in der zweiten Fragmente bin ich in der Lage die Schublade Menü zu streichen und zu sehen. Ich möchte dieses Verhalten nicht, Schubladenmenü sollte nur in Fragment 1 öffnen.

Wenn etwas in meinem Code falsch ist, lass es mich wissen.

+2

Können Sie ein kleines Diagramm über Ihren Workflow erstellen? –

+0

Ich fragte mich, ob Sie mir bitte ein wenig helfen könnten. Ich kann nicht den Zurück-Knopf bekommen, wenn ich Fragmente wechsele. Können Sie Ihre Layouts "toolbar_layout" und "navigation_items" zur Verfügung stellen, damit ich sehen kann, wie man ein Layout zum Arbeiten bringt, das die Back-Buttons beim Umschalten von Fragmenten unterstützt. Vielen Dank –

Antwort

13

Endlich die Antwort bekommen. In meinem Szenario deaktiviere ich die Schubladenanzeige um mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); und aufgrund dieses Navigationssymbols wurden Klicks deaktiviert. Um dies zu aktivieren, muss ich ToolbarNavigationClickListener zu ActionBarDrawerToggle hinzufügen, die Navigationssymbolklicks ermöglichen wird.

Unten ist der mein Arbeitscode: -

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

Refer this link for more clarification

2

mit dem gleichen Problem für Kinder ab Nach dem Kampf, ich schaffte es schließlich die Aufwärtstaste, erhalte in Fragmenten mit diesem Code zu arbeiten. Sie müssen setHasOptionsMenu in onCreate einrichten() oder onCreateView()

setHasOptionsMenu(true); 

Dann in onOptionsItemSelected() fügen Sie diese Prüfung für die Auf-/Home-Taste auf Ihrem Schalter gedrückt wird() [oder, wenn ... ] statement:

@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); 
} 
Verwandte Themen