android - fragment 在后台

标签 android android-fragments

在我的应用程序中,我的第一个 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/

相关文章:

android - 开发到所有设备

android - 当我单击 android 谷歌地图上的标记时如何隐藏 "Navigation"和 "GPS Pointer"按钮

java - Android 8 上不显示通知

android - fragment 中的 WebView 不加载 HTML 字符串

java - 如何将 Android Navigation Architecture fragment 动画化为滑过旧 fragment ?

java - 启动 BottomSheetFragment 获取结果

java - Android:从另一个打开 fragment

android - 使用 android studio 制作的应用仅在一部手机上显示广告,而在其他手机上不显示广告

javascript - 使用通过 EditText 获取的变量将 javascript 命令发送到 Webview

android - preference fragment 和 "regular"fragment 的区别