片段在后台

Zee*_*bir 6 android android-fragments

在我的应用程序中我的第一个Fragment是在BackStack中,并且在交易时没有将该片段添加到backstack.

编辑.

我在第一次横切后多次使用相同的碎片,但横切后跟第一个被添加到backstack addToBackStack(TAG);但我从未添加第一个碎片到backstack但仍然我不明白为什么我必须点击两次将应用程序发送到后台.

这是代码

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();
Run Code Online (Sandbox Code Playgroud)

现在,当我按下后退按钮时,它会删除片段,但应用程序不会转到后台.当我第二次按下后退按钮时,它会进入后台.

replace()本身是否将片段添加到backstack?如果是,那么我如何删除片段并让我的应用程序转到后台onBackPressed?如果它没有将片段添加到backstack那么为什么会发生这种情况?我该如何让它正常工作?

谢谢!

编辑:

这是完整的活动代码.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

MCVE

这是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是碎片.

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;
}
Run Code Online (Sandbox Code Playgroud)

Nez*_*cer -1

在 onBackPressed 中,在 super.onBackPressed() 之前添加以下内容:

moveTaskToBack(true);
Run Code Online (Sandbox Code Playgroud)

编辑

要实现您所需的功能,请尝试以下操作:

 @Override
public void onBackPressed() {

    int count = getFragmentManager().getBackStackEntryCount();
    //pop all fragments till it remains the first fragment then move to background
    if (count == 1) {
        super.onBackPressed();
        //additional code
    } else {
        getFragmentManager().popBackStack();
    }

}
Run Code Online (Sandbox Code Playgroud)