将片段替换为后退按钮

时间:2015-07-23 14:51:40

标签: android fragment back-button

我正在尝试覆盖后退按钮,因为当我按下时它正在关闭我的应用程序,我有不同的碎片:

  • 片段A:索引(当我按下后退按钮时,它会关闭应用程序)
  • 片段B(当我按下后退按钮时,它将返回到片段A)
  • 片段C(当我按下后退按钮时,它将返回到片段A)

我有我的主要活动:它管理我的碎片(有导航抽屉)。

我发现了很多帖子,但我无法实现它们:

在片段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"));
        }
    }
}

@jujyfruits

我试过但它不起作用:

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

@AutonomousApps

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

3 个答案:

答案 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()