2016-04-27 99 views
1

我正在處理導航抽屜和碎片,目前我正面臨圖像問題考慮(甜甜圈)是HomeFragment類。 我想要實現的是片段後臺工作android

this

當用戶導航片段A(甜甜圈) - >片段B(埃克萊爾)然後再次 可前往[ - >片段H(奇巧),然後導航 - >片段 我(棒棒堂)

和用戶正在處理它。如果用戶按後退按鈕也可以根據層次 作品

super.onBackPressed(); 

至於結果逼人退的結果片段I - >片段H - > 片段B - >最後片段A.

現在我需要將用戶直接導航到片段A而無需轉到其他片段類。

我已經實現了這個使用

public class MainActivity extends AppCompatActivity { 
//initializing 
int check = 0; in MainActivity 
.................... 
................... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_drawer); 

................. 
................ 

drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       TextView tv = (TextView) view.findViewById(R.id.textView1); 
       String aa = tv.getText().toString(); 
       selectItemFragment(position, aa); 
      } 
     }); 

................... 
................... 
private void selectItemFragment(int position, String aa) { 
     Fragment fragment2; 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     switch (position) { 
      case 0: 
       fragment2 = new HomeFragment(); 
       break; 
      case 1: 
       fragment2 = new GalaxyFragment(); 
       break; 
      case 2: 
       fragment2 = new ShareFragment(); 
       break; 
      default: 
       fragment2 = new HomeFragment(); 
       break; 
     } 
     check = position; 
     ffragm = fragment2; 
     fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit(); 
     drawerList.setItemChecked(position, true); 
     setTitle(aa); 
     mDrawerLayout.closeDrawer(drawerList); 
    } 
.......................... 
............................ 
@Override 
    public void onBackPressed() { 
     if (check == 0) { 
      finish(); 
     } else { 
      check = 0; 
      Fragment fragment2; 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragment2 = new HomeFragment(); 
      fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit(); 
     } 
} 

這裏IM面臨的問題, 考慮當用戶Galaxyfragment類或任何其它片段類的內部工作,他導航到另一個片段類裏面,然後他按後退按鈕它直接導航到片段A.So,在這裏我需要使用返回堆棧層次結構,最後到片段類並完成應用程序,請參閱下面的代碼。

public class GalaxyFragment extends Fragment { 
    Context cc; 
    Button Addbutton; 

    public GalaxyFragment() { 
     // Required empty public constructor 
    } 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.home_fragment, container, false); 
     ll1design = (LinearLayout) v.findViewById(R.id.llone); 
     Create_list = (Button) v.findViewById(R.id.submit); 
    Addbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       display_button.setVisibility(View.VISIBLE); 
       ll1design.setVisibility(View.GONE); 
       String value = ""; 
       Bundle bundle = new Bundle(); 
       bundle.putString("message", "" + value); 
       FragmentManager fragmentManager = getFragmentManager(); 
       Fragment fragment = new ShareFragment(); 
       fragment.setArguments(bundle); 
       fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack(null).commit(); 
      } 
     }); 
    return v; 
    } 
} 

所以這裏

我需要(實現)使用後退按鈕以正常工作爲Galaxy2Fragment - > GalaxyFragment - > HomeFragment類。

任何人都可以給我建議如何在這些類型的案件上的這些Backbutton片段工作。歡迎提出建議。謝謝。

+0

您可以使用fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);這直接進入片段堆棧的底部。 – Triode

+0

你的意思是你希望直接導航到第一個片段,並打開其他片段? –

+0

@Triode謝謝,我嘗試使用帶有一些邏輯的POP_BACK_STACK_INCLUSIVE。 –

回答

1

最簡單的方法是,以取代這一行

fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit(); 

FragmentTransaction ft =fragmentManager.beginTransaction() 
ft.replace(R.id.main_fragment_container, fragment2) 
if(fragmentManger.findFragmentById(R.id.main_fragment_container) instanceof HomeFragment) 
    ft.addToBackStack(null)) 
ft.commit(); 

如果您這樣做,則不需要重寫onBackPressed。

+0

謝謝你完美。 –

0

嘗試這樣的事情......

if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) { 
      <Open fragment 1> 
      <set the title> 

     } else { 
      finish(); 
     } 
} 
+0

感謝您的答覆,讓我檢查和更新。 –

+0

你試過了嗎? – AbhayBohra

1

要設置addtobackstack爲null。相反,您應該編寫替換片段的TAG名稱。

fragmentManager.beginTransaction()。replace(R.id.main_fragment_container,fragment).addToBackStack(null)。承諾();

代替

fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack("**TAG name of an replacing fragment**").commit(); 
+0

感謝您的回覆,讓我檢查並更新。 –

+0

我希望它對我有效,你的問題得到解決,如果它確實,那麼請upvote並接受答案。謝謝 –

+1

@Learner:我很高興你的問題得到解決。謝謝 –

1

情況1: 要直接從該比另一個開口的片段之前被打開以後

private void popByFragment() { 
     //keeping only the root fragment in the stack 
     int backStackCount = mFragmentManager.getBackStackEntryCount(); 
     for (int i = 1; i < backStackCount; i++) { 
      // we start from "i=1" since we dont wish to pop the 1st fragment added to stack 
      //Get backstack fragment id 
      //Log.e("backstack count", "count-->" + backStackCount); 
      int backStackId = mFragmentManager.getBackStackEntryAt(i).getId(); 
      mFragmentManager.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
} 

調用此方法的任何其它片段導航到第一片段第一個片段

案例2:假設 - FragmentC - > FragmentB - > FragmentA。

對於這一切,你所要做的就是commiting之前使用fragmentTransaction.addToBackstack(fragment.toString); ..然後在你的活動覆蓋onBackPress:

@Override 
    public void onBackPressed() { 

     if (getSupportFragmentManager().getBackStackEntryCount() > 1) { 

      mFragmentManager.popBackStackImmediate(); 
     } 
    } 

確保你不叫commiting此之前,「案例1」中提到的上述方法3個片段