BJM*_*BJM 3 android back-button fragment
我正在尝试覆盖后退按钮,因为它在我按下时关闭了我的应用程序,我有不同的片段:
我有我的主要活动:它管理我的片段(因为有一个导航抽屉)。
我发现了很多关于此的帖子,但我无法实现它们:
以片段 B 为例:
@Override
public void onBackPressed(){
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.fragmentb); // get the fragment that is currently loaded in placeholder
Object tag = f.getTag();
// do handling with help of tag here
// call super method
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
它说无法解析 onBackPressed() 和 getSupportFragmentManager(),我想我没有正确使用该方法,那怎么办?
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
private static String TAG = MainActivity.class.getSimpleName();
private Toolbar mToolbar;
private FragmentDrawer drawerFragment;
//Initialisation de l activite avec les donnees necessaires
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
drawerFragment = (FragmentDrawer)getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
drawerFragment.setDrawerListener(this);
// Affichage de la navigation
displayView(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Ajout des items
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDrawerItemSelected(View view, int position) {
displayView(position);
}
private void displayView(int position) {
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Accueil();
title = getString(R.string.title_accueil);
break;
case 1:
fragment = new NosOffres();
title = getString(R.string.title_nosoffres);
break;
case 2:
fragment = new DemandeGratuite();
title = getString(R.string.title_demandegratuite);
break;
case 3:
fragment = new ContactezNous();
title = getString(R.string.title_contact);
break;
case 4:
fragment = new Actualites();
title = getString(R.string.title_actu);
break;
case 5:
fragment = new MentionsLegales();
title = getString(R.string.title_mentions);
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
// libelle du toolbar
TextView titlet;
titlet = (TextView) findViewById(R.id.main_toolbar_title);
titlet.setText(title);
titlet.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/GothamBook.ttf"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过但它不起作用:
@Override
public void onBackPressed(){
Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.demande_gratuite);
if (myFragment != null && myFragment.isVisible()) {
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Reset...");
alertDialog.setMessage("test");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.show();
}
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
private static String TAG = MainActivity.class.getSimpleName();
private Toolbar mToolbar;
private FragmentDrawer drawerFragment;
//Initialisation de l activite avec les donnees necessaires
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
drawerFragment = (FragmentDrawer)getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
drawerFragment.setDrawerListener(this);
// Affichage de la navigation
displayView(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Ajout des items
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDrawerItemSelected(View view, int position) {
displayView(position);
}
private void displayView(int position) {
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Accueil();
title = getString(R.string.title_accueil);
break;
case 1:
fragment = new NosOffres();
title = getString(R.string.title_nosoffres);
break;
case 2:
fragment = new DemandeGratuite();
title = getString(R.string.title_demandegratuite);
break;
case 3:
fragment = new ContactezNous();
title = getString(R.string.title_contact);
break;
case 4:
fragment = new Actualites();
title = getString(R.string.title_actu);
break;
case 5:
fragment = new MentionsLegales();
title = getString(R.string.title_mentions);
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack("name");
fragmentTransaction.commit();
// libelle du toolbar
TextView titlet;
titlet = (TextView) findViewById(R.id.main_toolbar_title);
titlet.setText(title);
titlet.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/GothamBook.ttf"));
}
}
@Override
public void onBackPressed(){
FragmentManager mgr = getSupportFragmentManager();
if (mgr.getBackStackEntryCount() == 0) {
super.onBackPressed();
}else{
mgr.popBackStack();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在片段之间导航时使用的:
主活动.java:
@Override
public void onBackPressed() {
// note: you can also use 'getSupportFragmentManager()'
FragmentManager mgr = getFragmentManager();
if (mgr.getBackStackEntryCount() == 0) {
// No backstack to pop, so calling super
super.onBackPressed();
} else {
mgr.popBackStack();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑第二个:请注意,super.onBackPressed()如果您还没有处理它(例如,通过弹出片段管理器的后台堆栈),您只想调用它。
为此,您必须向FragmentManager的 backstack ( addToBackStack())添加新片段。例如(也在MainActivity.java 中):
private void displayView(int position) {
Fragment fragment = ...; // YOUR CODE HERE
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
// ADD THIS LINE
fragmentTransaction.addToBackStack("name"); // name can be null
fragmentTransaction.commit();
// libelle du toolbar
TextView titlet;
titlet = (TextView) findViewById(R.id.main_toolbar_title);
titlet.setText(title);
titlet.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/GothamBook.ttf"));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑第三个 (7/28):在您的onCreate(Bundle)方法中,您通过调用您的displayView(int)方法来执行您的第一个片段事务。displayView(int) 总是将其片段事务添加到后台堆栈中。这不是你想要的。第一个片段事务应该使用而不fragmentTransaction.**add**(int, Fragment)应该调用. 第一个之后的每个事务都应该调用并且应该调用. 这样做的原因是您的第一个交易基本上是将一个片段(您的 UI)“添加”到一个空容器(它不是“替换”另一个片段)。当这个事务在 backstack 上时,这意味着空容器状态也是addToBackStack(String)fragmentTransaction.**replace**(int, Fragment)addToBackStack(String)在后台。因此,当您弹出最后一笔交易时,它会显示一个空白 UI。
编辑第一个:当你调用addToBackStack(String name)一个FragmentTransaction对象(你通过调用获得getFragmentManager().beginTransaction())时,你正在向FragmentTransaction你FragmentManager的“backstack”添加一个。我的代码做的是检查大小通过调用堆栈中的getFragmentManager.getBackStackEntryCount()。如果该数字大于零,那么我们知道我们FragmentTransaction在 backstack 上有s。在这种情况下,您可以调用getFragmentManager.popBackStack(),它将从后台堆栈中弹出最后一个事务——换句话说,将您的应用程序返回到显示的最后一个 Fragment。
如果 backstack entry county 等于 0,那么这意味着你在你的 Fragment A 处,你应该调用super.onBackPressed(),这将导致应用程序退出。
| 归档时间: |
|
| 查看次数: |
5751 次 |
| 最近记录: |