2017-08-24 43 views
0

我用帶片段的導航抽屜製作項目,導航有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

做應用程序關閉或在logcat中拋出錯誤崩潰? –

回答

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

用於從您的堆棧中移除碎片

+0

你的回答是正確的,但我更願意讓Android處理背後的彈出窗口。如果他將來添加更多的碎片,處理它將會非常困難。 – jonathanrz

+0

後臺正是這個。 https://developer.android.com/training/implementing-navigation/temporal.html – jonathanrz

+1

OP想要使用** CUSTOM POPPING ** ......正如他提到**「我想要做的是片段更改從第三個片段到第一個片段。「** – sushildlh

0

添加碎片時,您應該將碎片添加到堆棧中,以便Android可以處理堆棧彈出。

你可以在這裏閱讀更多:https://developer.android.com/training/implementing-navigation/temporal.html

所以,你的代碼如下所示:

fragmentTransaction.remove(fragment); 
fragmentTransaction.replace(R.id.frame_container, fragment); 
fragmentTransaction.addToBackStack(); 
fragmentTransaction.commit(); 
+0

我必須把這個代碼放在哪裏? –

+0

@JoshParinussa在callFragment方法中。 – jonathanrz

+0

我已經在上面添加了ur代碼,但是當我在最後一個棧中時,我再次按下,應用程序向我顯示空白屏幕,只有導航抽屜和標題沒有視圖。我如何解決這個問題? –

0

當你調用fragmentTransaction.replace()爲要回你按返回鍵後的片段,儘量把它添加到堆棧中,像這樣:

private void callFragment(Fragment fragment) { 
     fragmentTransaction = fragmentManager.beginTransaction(); 
     if (fragment instanceof Monitoring) 
      fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.replace(R.id.frame_container, fragment); 
     fragmentTransaction.commit(); 
    } 
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(); 
    } 
}