我正在尝试覆盖后退按钮,因为当我按下时它正在关闭我的应用程序,我有不同的碎片:
我有我的主要活动:它管理我的碎片(有导航抽屉)。
我发现了很多帖子,但我无法实现它们:
在片段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();
}
它说无法解析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"));
}
}
}
我试过但它不起作用:
@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();
}
}
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();
}
}
答案 0 :(得分:3)
这是我在片段之间导航时使用的内容:
<强> MainActivity.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();
}
}
编辑第二个:请注意,如果您尚未处理它,则只需要致电super.onBackPressed()
(例如,弹出片段管理器&#39; s backstack)。
为了实现这一点,您必须在FragmentManager
的后台堆栈(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"));
}
}
编辑第三个(7/28):在onCreate(Bundle)
方法中,您可以通过调用displayView(int)
方法进行第一次片段交易。 displayView(int)
始终将其片段事务添加到backstack。这不是你想要的。非常第一个片段事务应该使用fragmentTransaction.**add**(int, Fragment)
并且不调用addToBackStack(String)
。 之后的每个事务应该调用fragmentTransaction.**replace**(int, Fragment)
而应该调用addToBackStack(String)
。这样做的原因是你第一次交易基本上是&#34;添加&#34;片段(您的UI)到空容器(它不是&#34;替换&#34;另一个片段)。当此事务在backstack上时,这意味着backstack上的空容器状态也。因此,当您弹出最后一个事务时,它会显示一个空白UI。
编辑第一个:当您在addToBackStack(String name)
对象(通过调用FragmentTransaction
获得)上调用getFragmentManager().beginTransaction()
时,您正在添加{{ 1}}到你的FragmentTransaction
s&#39; backstack&#39;。我的代码所做的是通过调用getFragmentManager.getBackStackEntryCount()
来检查backstack的 size 。如果该数字大于零,那么我们知道我们在后台上有FragmentManager
个。在这种情况下,您可以调用getFragmentManager.popBackStack()
,这将弹出最后一个事务从backstack - 换句话说,将您的应用程序返回到显示的最后一个片段。
如果Backstack条目县等于0,那么这意味着你在片段A处,而你应该拨打FragmentTransaction
,这将导致应用程序退出。
答案 1 :(得分:0)
onBackPressed()
和getSupportFragmentManager()
是Activity类中的方法,而不是Fragment,因此您必须在Activity而不是Fragment上实现此方法。
如果要为一个片段实现特定行为,可以检查当前可见片段的内容,然后实现您的行为。像这样:
@Override
public void onBackPressed(){
MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("YOUR_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
// the code for whatever behaviour you want goes here
}
else
super.onBackPressed();
}
另一种可能的,可能更简单的方法是在添加片段时激活的Activity中使用一些标志,然后从onBackPressed()
读取。
编辑对BENJY编辑的反应
请注意,您并未使用我发布的代码。您使用的findFragmentById()
并不适用于所有情况,我无法确定它是否适合您的代码。
您应该使用适用于任何类型的片段事务的findFragmentByTag
。
只需在执行事务时向片段添加标记,如下所示:
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment(), "FRAGMENT_TAG")
.commit();
然后,当您尝试在onBackPressed()
中找回片段时,您可以找到该标记:
PlaceholderFragment myFragment = (PlaceholderFragment) getSupportFragmentManager()
.findFragmentByTag("FRAGMENT_TAG");
进行此更改必须起作用。
答案 2 :(得分:0)
我知道这太迟了,无法回答,但是无论谁来这里,可能会得到帮助,我都会通过下面的方法实现。
如果您想更改片段,同时保持单击设备后退按钮上的活动,则上面提到的所有代码都可以删除下面的行。
super.onBackPressed()