Ketika menggunakan Navigasi Laci Android devs merekomendasikan bahwa dalam ActionBar "hanya layar yang diwakili dalam Laci Navigasi harus benar-benar memiliki Navigasi Laci gambar" dan "semua yang lain memiliki layar tradisional hingga karat."
Lihat di sini untuk rincian:
I'm menggunakan salah satu kegiatan untuk mengontrol beberapa tingkat dari fragmen dan bisa mendapatkan Navigasi Laci gambar untuk tampilan dan fungsi di semua tingkatan.
Ketika menciptakan tingkat yang lebih rendah fragmen yang bisa saya sebut ActionBarDrawerToggle
setDrawerIndicatorEnabled(palsu)
untuk menyembunyikan Navigasi Laci gambar dan Up caret ditampilkan
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Masalah saya'm memiliki adalah ketika saya menavigasi kembali ke tingkat atas fragmen Up karat masih menunjukkan bukan asli Laci Navigasi gambar. Saran tentang cara untuk "menyegarkan" ActionBar di tingkat atas fragmen untuk kembali menampilkan Navigasi Laci gambar?
Ketika mempersiapkan fragmen-fragmen baru untuk menggantikan orang lain, saya mengatur DrawerToggle setDrawerIndicatorEnabled(palsu)
seperti ini:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Berikutnya, di override dari onBackPressed
, saya kembali di atas dengan menetapkan DrawerToggle untuk setDrawerIndicatorEnabled(benar)
seperti ini:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
Di onCreate
menambahkan setHasOptionsMenu(benar)
untuk mengaktifkan konfigurasi menu pilihan. Juga mengatur setDisplayHomeAsUpEnabled(benar)
untuk mengaktifkan < di actionbar:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Kemudian di onOptionsItemSelected
kapan < ditekan panggilan onBackPressed()
dari aktivitas untuk bergerak naik satu tingkat dalam hirarki dan menampilkan Navigasi Laci Gambar:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
It's semudah 1-2-3.
Jika anda ingin mencapai:
Laci Indikator - jika tidak ada fragmen yang berada di Belakang Tumpukan atau Laci dibuka
Panah - ketika beberapa Fragmen yang di Belakang Tumpukan
private FragmentManager.OnBackStackChangedListener
mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
syncActionBarArrowState();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.drawable.ic_navigation_drawer,
0,
0
) {
public void onDrawerClosed(View view) {
syncActionBarArrowState();
}
public void onDrawerOpened(View drawerView) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}
@Override
protected void onDestroy() {
getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
super.onDestroy();
}
private void syncActionBarArrowState() {
int backStackEntryCount =
getSupportFragmentManager().getBackStackEntryCount();
mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.isDrawerIndicatorEnabled() &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == android.R.id.home &&
getSupportFragmentManager().popBackStackImmediate()) {
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
P. S. Lihat Membuat Navigasi Laci pada Pengembang Android pada tips lain tentang 3-garis indikator perilaku.
Anda telah menulis bahwa, untuk menerapkan tingkat yang lebih rendah fragmen, anda mengganti yang sudah ada fragmen, sebagai lawan untuk menerapkan tingkat yang lebih rendah fragmen dalam aktivitas baru.
Saya akan berpikir bahwa anda kemudian akan memiliki untuk melaksanakan kembali fungsi manual: ketika pengguna menekan punggung anda memiliki kode yang muncul stack (misalnya dalam Kegiatan::onBackPressed
override). Jadi, dimanapun anda melakukan itu, anda dapat membalikkan setDrawerIndicatorEnabled
.
I've digunakan selanjutnya:
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if(getSupportFragmentManager().getBackStackEntryCount() > 0){
mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
else {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
}
});
Jika anda up bar action button doesn't bekerja, don't lupa untuk menambahkan pendengar :
// Navigation back icon listener
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
I've mendapat beberapa kesulitan menerapkan laci navigasi dengan tombol home, semuanya bekerja kecuali tindakan buton.
Cobalah penanganan Rumah pemilihan item di MainActivity tergantung pada keadaan DrawerToggle. Dengan cara ini anda don't harus menambahkan kode yang sama untuk setiap fragmen.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Only handle with DrawerToggle if the drawer indicator is enabled.
if (mDrawerToggle.isDrawerIndicatorEnabled() &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
// Handle home button in non-drawer mode
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
FOLLOW UP
Solusi yang diberikan oleh @dzeikei rapi, tetapi dapat diperpanjang, bila menggunakan fragmen, untuk secara otomatis menangani pengaturan kembali laci indikator ketika backstack kosong.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Only handle with DrawerToggle if the drawer indicator is enabled.
if (mDrawerToggle.isDrawerIndicatorEnabled() &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
// Handle home button in non-drawer mode
case android.R.id.home:
// Use getSupportFragmentManager() to support older devices
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.popBackStack();
// Make sure transactions are finished before reading backstack count
fragmentManager.executePendingTransactions();
if (fragmentManager.getBackStackEntryCount() < 1){
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
EDIT
Untuk pertanyaan dari @JJD.
Fragmen yang diselenggarakan/dikelola dalam suatu kegiatan. Kode di atas ditulis sekali dalam kegiatan itu, tapi hanya menangani sampai sisipan untuk onOptionsItemSelected
.
Di salah satu aplikasi saya saya juga sangat dibutuhkan untuk menangani perilaku up caret ketika tombol kembali ditekan. Hal ini dapat diatasi dengan meng-override onBackPressed
.
@Override
public void onBackPressed() {
// Use getSupportFragmentManager() to support older devices
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.executePendingTransactions();
if (fragmentManager.getBackStackEntryCount() < 1){
super.onBackPressed();
} else {
fragmentManager.executePendingTransactions();
fragmentManager.popBackStack();
fragmentManager.executePendingTransactions();
if (fragmentManager.getBackStackEntryCount() < 1){
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
}
};
Perhatikan kode duplikasi antara onOptionsItemSelected
dan onBackPressed
yang dapat dihindari dengan menciptakan metode dan memanggil metode yang di kedua tempat.
Perhatikan juga saya tambahkan dua kali lebih executePendingTransactions
yang dalam kasus saya adalah yang dibutuhkan atau yang lain aku punya kadang-kadang perilaku aneh dari karet.
Ini jawaban bekerja tapi ada sedikit masalah dengan itu.
The getSupportActionBar().setDisplayHomeAsUpEnabled(palsu)
tidak disebut secara eksplisit dan itu menyebabkan ikon laci untuk disembunyikan bahkan ketika tidak ada barang-barang di backstack sehingga mengubah setActionBarArrowDependingOnFragmentsbackstack()
metode yang bekerja untuk saya.
private void setActionBarArrowDependingOnFragmentsBackStack() {
int backStackEntryCount = getSupportFragmentManager()
.getBackStackEntryCount();
// If there are no items in the back stack
if (backStackEntryCount == 0) {
// Please make sure that UP CARAT is Hidden otherwise Drawer icon
// wont display
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
// Display the Drawer Icon
mDrawerToggle.setDrawerIndicatorEnabled(true);
} else {
// Show the Up carat
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Hide the Drawer Icon
mDrawerToggle.setDrawerIndicatorEnabled(false);
}
}
Saya menciptakan sebuah antarmuka untuk hosting kegiatan untuk memperbarui melihat keadaan menu hamburger. Untuk tingkat atas fragmen aku mengatur beralih ke benar
dan untuk fragmen yang saya inginkan untuk menampilkan up < panah I set beralih ke palsu
.
public class SomeFragment extends Fragment {
public interface OnFragmentInteractionListener {
public void showDrawerToggle(boolean showDrawerToggle);
}
private OnFragmentInteractionListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
this.mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener");
}
}
@Override
public void onResume() {
super.onResume();
mListener.showDrawerToggle(false);
}
}
Kemudian dalam Aktivitas saya ...
public class MainActivity extends Activity implements SomeFragment.OnFragmentInteractionListener {
private ActionBarDrawerToggle mDrawerToggle;
public void showDrawerToggle(boolean showDrawerIndicator) {
mDrawerToggle.setDrawerIndicatorEnabled(showDrawerIndicator);
}
}
Jika anda melihat pada aplikasi GMAIL dan datang ke sini untuk mencari carret/affordance icon..
Saya akan meminta anda untuk melakukan hal ini, tidak ada satupun jawaban di atas sudah jelas. saya bisa memodifikasi jawaban yang diterima.
subfragments akan terdaftar seperti ini
firstFragment == posisi 0 ---> ini akan memiliki subfragments --> fragmen
secondFragment
thirdFragment dan sebagainya....
Di firstFragment anda memiliki fragmen.
Panggilan ini pada DrawerActivity
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
mDrawerToggle.setDrawerIndicatorEnabled(false);
} else {
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
}
});
dan di fragmen
setHasOptionsMenu(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
activity.onBackPressed();
return true;
}
return false;
}
Pada OnBackPressed Laci kegiatan metode mengatur laci beralih ke true untuk mengaktifkan navigasi daftar ikon lagi.
Terima kasih, Pusp
Logika yang jelas. Tampilkan tombol kembali jika fragmen kembali tumpukan jelas. Bahan hamburger-kembali animasi jika fragmen stack tidak jelas.
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
syncActionBarArrowState();
}
}
);
private void syncActionBarArrowState() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
mNavigationDrawerFragment.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
//add these in Your NavigationDrawer fragment class
public void setDrawerIndicatorEnabled(boolean flag){
ActionBar actionBar = getActionBar();
if (!flag) {
mDrawerToggle.setDrawerIndicatorEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
mDrawerToggle.setHomeAsUpIndicator(getColoredArrow());
} else {
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
mDrawerToggle.syncState();
getActivity().supportInvalidateOptionsMenu();
}
//download back button from this(https://www.google.com/design/icons/) website and add to your project
private Drawable getColoredArrow() {
Drawable arrowDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.ic_arrow_back_black_24dp);
Drawable wrapped = DrawableCompat.wrap(arrowDrawable);
if (arrowDrawable != null && wrapped != null) {
// This should avoid tinting all the arrows
arrowDrawable.mutate();
DrawableCompat.setTint(wrapped, Color.GRAY);
}
return wrapped;
}
IMO, menggunakan onNavigateUp() (seperti yang ditunjukkan di sini) di riwnodennyk's atau Tom's solusi yang lebih bersih dan tampaknya bekerja dengan baik. Hanya mengganti onOptionsItemSelected dengan kode ini:
@Override
public boolean onSupportNavigateUp() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
// handle up navigation
return true;
} else {
return super.onSupportNavigateUp();
}
}