Android 当我在片段(PreferenceFragment)中按back键时,应用程序关闭

Android 当我在片段(PreferenceFragment)中按back键时,应用程序关闭,android,android-fragments,Android,Android Fragments,我有一个带导航抽屉的应用程序。它由两个项目组成:主设置和设置。所有物品都是碎片。“设置”扩展了PreferenceFragment 我有问题。当我启动应用程序时-打开MainFragment。我切换到PreferencesFragment,然后按Back。在这种情况下,我的应用程序必须切换到MainFragment,但应用程序已关闭 main活动 import android.app.Fragment; import android.app.FragmentManager; import and

我有一个带导航抽屉的应用程序。它由两个项目组成:主设置和设置。所有物品都是碎片。“设置”扩展了PreferenceFragment

我有问题。当我启动应用程序时-打开MainFragment。我切换到PreferencesFragment,然后按Back。在这种情况下,我的应用程序必须切换到MainFragment,但应用程序已关闭

main活动

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.egoriku.lesson_16.R;
import com.egoriku.lesson_16.adapters.ClassAdapter;
import com.egoriku.lesson_16.adapters.DataAdapter;
import com.egoriku.lesson_16.fragments.MainFragment;
import com.egoriku.lesson_16.fragments.PreferencesFragment;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private ListView drawerListView;
private List<DataAdapter> list;
private ClassAdapter adapter;


public static final String TAG_MAIN = "TAG_MAIN";
public static final String TAG_SETTING = "TAG_SETTING";

private String itemDrawerMain;
private String itemDrawerSettings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e("onCreate", "start");

    itemDrawerMain = getString(R.string.item_drawer_main);
    itemDrawerSettings = getString(R.string.item_drawer_settings);

    drawerLayout = (DrawerLayout) findViewById(R.id.draver_layout);
    toolbar = (Toolbar) findViewById(R.id.toolbar);

    drawerListView = (ListView) findViewById(R.id.nav_list);
    drawerListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

    list = new ArrayList<>();
    AddMenuItem(list);

    drawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String tag = list.get(position).getTagFragment();

            if (tag.equals(MainFragment.TAG_MAINFRAGMENT)) {
                showFragment(
                        MainFragment.newInstance(),
                        MainFragment.TAG_MAINFRAGMENT,
                        null,
                        true
                );
                drawerLayout.closeDrawers();
            }

            if (tag.equals(PreferencesFragment.TAG_PREFERENCE)) {
                showFragment (
                        PreferencesFragment.newInstanse(),
                        PreferencesFragment.TAG_PREFERENCE,
                        MainFragment.TAG_MAINFRAGMENT,
                        false
                );
                drawerLayout.closeDrawers();
            }
        }
    });

    setSupportActionBar(toolbar);
    drawerToggle = new ActionBarDrawerToggle(
            this,
            drawerLayout,
            toolbar,
            R.string.drawer_open,
            R.string.drawer_close
    );

    drawerLayout.addDrawerListener(drawerToggle);

    if (savedInstanceState == null) {
        Log.e("savedInstanceState", "start");

        showFragment(MainFragment.newInstance(), MainFragment.TAG_MAINFRAGMENT, null, true);
    }
}

private void AddMenuItem(List<DataAdapter> list) {
    Log.e("AddMenuItem", "start");
    list.add(new DataAdapter(itemDrawerMain, R.drawable.ic_main_black, MainFragment.TAG_MAINFRAGMENT));
    list.add(new DataAdapter(itemDrawerSettings, R.drawable.ic_setting_black, PreferencesFragment.TAG_PREFERENCE));
    drawerListView.setAdapter(new ClassAdapter(list, this));
}

//функция для переключения фрагментом
private void showFragment(
        Fragment fragment,
        String tag,
        String clearToTag,
        boolean clearInclusive
) {
    Log.e("showFragment", "start");

    FragmentManager fragmentManager = getFragmentManager();

    if (clearToTag != null || clearInclusive) {
        fragmentManager.popBackStack(
                clearToTag,
                clearInclusive ? FragmentManager.POP_BACK_STACK_INCLUSIVE : 0
        );
    }

    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.fragment_container, fragment, tag);
    transaction.addToBackStack(tag);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();
}

//нужен для drawer toggle
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
    Log.e("onPostCreate", "start");
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

//нужен для drawer toggle
@Override
public void onConfigurationChanged(Configuration newConfig) {
    Log.e("onConfigurationChanged", "start");
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}

//нужен для drawer toggle
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.e("onOptionsItemSelected", "start");
    return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}

//нужно для хорошего UX
@Override
public void onBackPressed() {
    if (drawerLayout.isDrawerVisible(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START);
        Log.e("onBask", "start");
        return;
    }

    Log.e("onback", String.valueOf(getFragmentManager().getBackStackEntryCount()));
    if (getFragmentManager().getBackStackEntryCount() == 1) {
        finish();
        Log.e("onBask", "count");
        return;
    }
    super.onBackPressed();
}
}

好吧,应用程序肯定会关闭,因为你基本上只有一个活动,其中你在切换两个不同的片段

您的问题的解决方案是覆盖
onBackPressed
方法,以检查您是否在设置片段中(您可以使用一些指示器来检查哪个片段当前处于活动状态),如果您在
设置中,只需重新打开
main片段即可

@Override
public void onBackPressed() {
        if (inSettingsFragment)
           showFragment(MainFragment.newInstance(),MainFragment.TAG_MAINFRAGMENT,null,true);
       else { finish();}
    }

好吧,应用程序肯定会关闭,因为你基本上只有一个活动,其中你在切换两个不同的片段

您的问题的解决方案是覆盖
onBackPressed
方法,以检查您是否在设置片段中(您可以使用一些指示器来检查哪个片段当前处于活动状态),如果您在
设置中,只需重新打开
main片段即可

@Override
public void onBackPressed() {
        if (inSettingsFragment)
           showFragment(MainFragment.newInstance(),MainFragment.TAG_MAINFRAGMENT,null,true);
       else { finish();}
    }

Main活动中重写
onBackPressed()

在您的
Main活动中覆盖
onBackPressed()
以您希望它工作的方式,您可以检查您是否在
Settings
片段中,如果在,则不退出,只显示
Main
片段,如果您在
Main
片段中,则可以调用
finish()

在首选项片段中,您必须在Backpressed mehod中实现,并且您必须向目标片段或活动激发意图。您不能在片段@AmitRanjan中在Backpressed中实现。只有在Actuvio中,你还可以在片段中实现OnBut后推……只是谷歌ITIF,我的答案有助于修复它,你可以考虑接受它吗?谢谢。在PreferencesFragment中,您必须在Backpressed mehod中实现,您必须向目标片段或活动激发意图。您不能在片段@AmitRanjan中实现onBackPressed。只有在Actuvio中,你还可以在片段中实现OnBut后推……只是谷歌ITIF,我的答案有助于修复它,你可以考虑接受它吗?谢谢