在我的应用程序中,我的第一个 Fragment
在 BackStack 中,并且该 fragment 在交易时没有添加到 backstack。
编辑。
I am using same fragment many times after first transections but transection followed by first one are added to backstack with
addToBackStack(TAG);
but i never added first fragment to backstack but still i don't understand why i have to click twice to send the app to background.
代码如下
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE);
feedFragment.setArguments(args);
fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit();
现在,当我按下后退按钮时,它会删除 fragment ,但应用程序不会进入后台。当我第二次按下后退按钮时,它进入后台。
replace()
本身是否将 fragment 添加到 backstack 中?如果是,那么我如何删除 fragment 并让我的应用程序进入后台 onBackPressed
?
如果它没有将 fragment 添加到 backstack 那么为什么会发生这种情况?我应该如何让它正常工作?
谢谢!
编辑:
这里是完整的 Activity 代码。
public class MainActivity extends AppCompatActivity {
private final String TAG = getClass().getName();
private DrawerLayout drawerLayout;
private FeedFragment feedFragment = new FeedFragment();
private ListView listView;
private LinearLayout searchLayout;
private RelativeLayout logolayout;
private Toolbar toolbar;
private Button settingBtn;
private Button bookmarkBtn;
private Button searchBtn;
private Tracker mTracker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApplicationController applicationController = (ApplicationController) getApplication();
mTracker = applicationController.getDefault();
initToolbar();
initUi();
loadCategorgies();
initFeed();
}
public void initUi() {
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
listView = (ListView) findViewById(R.id.lv_categories);
settingBtn = (Button) findViewById(R.id.btn_settings);
bookmarkBtn = (Button) findViewById(R.id.btn_bookmarks);
searchBtn = (Button) findViewById(R.id.btn_search);
settingBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, new SettingFragment()).addToBackStack("setting").commit();
drawerLayout.closeDrawers();
}
});
bookmarkBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, new BookmarkFragment()).addToBackStack("bookmark").commit();
drawerLayout.closeDrawers();
}
});
searchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, new SearchFragment()).addToBackStack("search").commit();
drawerLayout.closeDrawers();
}
});
}
public void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void hideLogo() {
ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo);
imageView.setVisibility(View.GONE);
}
public void showLogo() {
ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo);
imageView.setVisibility(View.VISIBLE);
}
public void loadCategorgies() {
StringRequest stringRequest = new StringRequest(Constants.URL_GET_CATEGORIES, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (Constants.isDev)
Log.d(TAG, response);
final CategoriesDTO categoriesDTO = Constants.gson.fromJson(response, CategoriesDTO.class);
CatgoriesAdapter catgoriesAdapter = new CatgoriesAdapter(categoriesDTO, MainActivity.this);
listView.setAdapter(catgoriesAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (Constants.isDev)
Log.d(TAG, "clicked" + categoriesDTO.getCategories().get(position).getTitle());
FeedFragment feedFragment = new FeedFragment();
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug());
feedFragment.setArguments(args);
fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit();
drawerLayout.closeDrawers();
}
});
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
ApplicationController.getmInstance().addToRequestQueue(stringRequest);
}
public void initFeed() {
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE);
feedFragment.setArguments(args);
fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
drawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
if (Constants.isDev)
Log.i(TAG, "Setting screen name: " + TAG);
mTracker.setScreenName("Image~" + TAG);
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
}
@Override
public void onBackPressed() {
super.onBackPressed();
//moveTaskToBack(true);
}
}
编辑
麦克韦
这是 HomeActivity。
public class HomeActivity extends AppCompatActivity {
private final String TAG = getClass().getName();
private DrawerLayout drawerLayout;
private FragmentManager fragmentManager;
private FeedFragment feedFragment = new FeedFragment();
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity);
fragmentManager = getSupportFragmentManager();
initToolbar();
initFeed();
}
public void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void initUi() {
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
}
public void initFeed() {
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE);
feedFragment.setArguments(args);
fragmentManager.beginTransaction().replace(R.id.content_frame, feedFragment).commit();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
drawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
if (Constants.isDev)
Log.i(TAG, "Setting screen name: " + TAG);
mTracker.setScreenName("Image~" + TAG);
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
}
这是 fragment 。
public class FeedFragment extends Fragment {
private final String TAG = getClass().getName();
private View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.feed_fragment, container, false);
return view;
}
最佳答案
这段代码很好,当你开始 Activity 时没有问题,你不会把它放在后台堆栈中。
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE);
feedFragment.setArguments(args);
fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit();
但在 initUI() 之后调用 loadcategories() 方法,将提要 fragment 放入后台堆栈。所以这就是您需要点击两次的原因。
FeedFragment feedFragment = new FeedFragment();
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug());
feedFragment.setArguments(args);
fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit();
做一件事
@Override
public void onBackPressed() {
FragmentManager fm = getFragmentManager();
if(fm.getBackStackEntryCount() == 1){
fm.popBackStack ("YOUR_TAG",FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
super.onBackPressed();
}
关于android - fragment 在后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37210656/