2016-04-27 118 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个片段