我用带有片段的导航抽屉制作项目,导航有3个片段。我有问题,当我在第三个片段时,我按下按钮,应用程序突然关闭,但我想要做的是从第三个片段到第一个片段的片段更改。我怎么能这样做?
这是我的MainActivity代码:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Toolbar toolbar;
DrawerLayout drawer;
NavigationView navigationView;
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
Fragment fragment = null;
SessionManager session;
TextView kode_kt, nama_ketua;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
session = new SessionManager(getApplicationContext());
session.checkLogin();
fragmentManager = getFragmentManager();
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View header=navigationView.getHeaderView(0);
kode_kt = (TextView)header.findViewById(R.id.username);
nama_ketua = (TextView)header.findViewById(R.id.email);
HashMap<String, String> user = session.getUserDetails();
kode_kt.setText(user.get(SessionManager.KEY_KODE));
nama_ketua.setText(user.get(SessionManager.KEY_KETUA));
// email.setText("Jopa Software House");
// tampilan default awal ketika aplikasii dijalankan
if (savedInstanceState == null) {
fragment = new Monitoring();
callFragment(fragment);
}
}
@Override
public void onBackPressed() {
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
Toast.makeText(getApplicationContext(), "Action Settings", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
// Untuk memanggil layout dari menu yang dipilih
if (id == R.id.nav_camera) {
fragment = new Monitoring();
callFragment(fragment);
} else if (id == R.id.nav_gallery) {
showDialog();
} else if (id == R.id.nav_send) {
fragment = new Akun();
callFragment(fragment);
}
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
// untuk mengganti isi kontainer menu yang dipiih
private void callFragment(Fragment fragment) {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragment);
fragmentTransaction.replace(R.id.frame_container, fragment);
fragmentTransaction.commit();
}
private void showDialog(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
this);
// set title dialog
alertDialogBuilder.setTitle("Keluar Akun");
// set pesan dari dialog
alertDialogBuilder
.setMessage("Anda ingin keluar dari akun?")
.setIcon(R.mipmap.ic_launcher)
.setCancelable(false)
.setPositiveButton("Ya",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// jika tombol diklik, maka akan menutup activity ini
session.logoutUser();
}
})
.setNegativeButton("Tidak",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// jika tombol ini diklik, akan menutup dialog
// dan tidak terjadi apa2
dialog.cancel();
}
});
// membuat alert dialog dari builder
AlertDialog alertDialog = alertDialogBuilder.create();
// menampilkan alert dialog
alertDialog.show();
}
}
答案 0 :(得分:1)
在您的活动中使用此代码
@Override
public void onBackPressed() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.maincontainer);
if (f instanceof FirstFragment) {
// do operations
} else if (f instanceof SecondFragment) {
// do operations
} else if (f instanceof ThirdFragment) {
// do operations
}else {
super.onBackPressed();
}
}
并使用....
getSupportFragmentManager().popBackStack();
用于从您的STACK中删除片段
答案 1 :(得分:0)
添加片段时,您应该将片段添加到Backstack中,以便Android能够为您的后台堆栈处理弹出窗口。
您可以在此处阅读更多内容:https://developer.android.com/training/implementing-navigation/temporal.html
因此,您的代码如下:
fragmentTransaction.remove(fragment);
fragmentTransaction.replace(R.id.frame_container, fragment);
fragmentTransaction.addToBackStack();
fragmentTransaction.commit();
答案 2 :(得分:0)
按下“返回”按钮后,当您为要返回的片段调用fragmentTransaction.replace()
时,请尝试将其添加到backStack,如下所示:
private void callFragment(Fragment fragment) {
fragmentTransaction = fragmentManager.beginTransaction();
if (fragment instanceof Monitoring)
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frame_container, fragment);
fragmentTransaction.commit();
}
答案 3 :(得分:0)
@Override
public void onBackPressed() {
// This overrides default behavior for onBackPressed so that it does nothing.
// This fixes the bug where when you disconnect the watch from wire, and reconnect,
// the current current fragment will pop out.
Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (f instanceof CustomFragmentClass) {// do something with f
((CustomFragmentClass) f).doSomething();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_holder,new FragmentSample());
transaction.commit();
}
}