簡體   English   中英

Android將Backstack與片段配合使用

[英]Android use backstack with fragments

今天,我在使用Android時遇到了另一個問題。

首先,我有一個具有登錄活動的應用程序。 因此,當我的憑據正確無誤時,我會使用一種意圖開始新的活動。 所以現在您看到一個標簽欄。 當我調用onTabSelected()方法時,我刪除了當前片段並顯示了例如gridview。 如果我在此gridview中點擊一個元素,則會替換該片段,並且我的應用程序將深入到另一個片段(帶有另一個詳細信息片段的可擴展列表)中。

所以我的問題是,如果我現在點擊后退按鈕,該應用程序將返回到我的第一個活動(登錄活動),而不是最后一個應該是網格視圖的片段。

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    FragmentManager fm = getFragmentManager();
    Fragment frag = fm.findFragmentById(R.id.container);
    FragmentTransaction tr = fm.beginTransaction();


    switch (tab.getPosition()) {
    case 1: {//Produkte
        ProdukteGrid pg = new ProdukteGrid();           

        if(frag != null)
            tr.remove(frag);

        tr.add(R.id.container, pg,pg.getTAG());
        tr.addToBackStack(pg.getTAG());
    }

...我的網格:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.produkte_gridmain, container, false);

    mGV = (GridView) v.findViewById(R.id.gridView1);
    mGV.setAdapter(new ImageAdapter(getActivity(), CATEGORY));

    mGV.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            FragmentManager fm = getFragmentManager();
            Fragment frag = fm.findFragmentById(R.id.container);
            FragmentTransaction tr = fm.beginTransaction();
            switch (position) {
            case 0: {
                // startActivity(new Intent(MyGrid.this,
                // MainActivity.class));
                ProdukteList f = new ProdukteList();

                tr.remove(frag);
                tr.add(R.id.container, f,f.getTAG());
                tr.addToBackStack(f.getTAG());
            }
                break;
            }
            tr.commit();
        }
    });
    return v;
}

我的主要布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

</FrameLayout>

我希望你能幫幫我..:)

編輯

為了更好地理解,我添加了一張圖片: 在此處輸入圖片說明

您應該使用replace而不是removeadd fragment

代替這個:

tr.remove(frag);
tr.add(R.id.container, f,f.getTAG());

用這個 :

tr.replace(R.id.container, f,f.getTAG());

並檢查您是否在活動中override onBackPressed事件。 檢查那里的代碼,確保您沒有手動完成活動。

而不是刪除並添加嘗試替換片段:

   fragmentTransaction.replace(..............);
    transaction.addToBackStack(null);
    fragmentTransaction.commit();

如果可以幫助您,通常我會這樣進行轉換:

AlbumGridFragment fragment = new AlbumGridFragment();
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.animator.anim_back_right, R.animator.anim_back_left, R.animator.anim_left, R.animator.anim_right)
                .add(R.id.album_fragment, fragment).addToBackStack(MainFragmentActivity.ALBUM_GRID_TAG).commit();

和BackTrack例如:

        FragmentManager fragmentManager = getSupportFragmentManager();
        int stackSize = fragmentManager.getBackStackEntryCount();
        if (stackSize == 0) {
            finish();
        }
        else {
            String fragmentTag = fragmentManager.getBackStackEntryAt(stackSize - 1).getName();
            fragmentManager.popBackStack(fragmentTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM