Android 当我在片段(PreferenceFragment)中按back键时,应用程序关闭
我有一个带导航抽屉的应用程序。它由两个项目组成:主设置和设置。所有物品都是碎片。“设置”扩展了PreferenceFragment 我有问题。当我启动应用程序时-打开MainFragment。我切换到PreferencesFragment,然后按Back。在这种情况下,我的应用程序必须切换到MainFragment,但应用程序已关闭 main活动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
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,我的答案有助于修复它,你可以考虑接受它吗?谢谢