使用Fragment Backbutton android

时间:2016-04-27 12:15:38

标签: java android android-fragments back-button

我正在处理导航抽屉和片段,目前我正面临着来自图像的问题考虑(Donut)是HomeFragment类。 我想要实现的是

this

  

当用户导航片段A(甜甜圈) - >片段B(Eclair)然后再次   导航 - >片段H(kitkat)然后导航 - >分段   I(棒棒糖)

和用户正在处理它。如果用户按下后退按钮它可能 基于层次结构工作

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();
        }
}

我在这里遇到问题, 考虑当用户在Galaxyfragment类或任何其他片段类中工作时,他导航到另一个片段类里面,然后按回按钮直接导航到Fragment A.So,这里我需要使用后面的堆栈层次结构,最后到Fragment分类并完成申请,请参阅以下代码。

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;
    }
}

所以这里

  

我需要(实现)使用backbutton正常工作,如Galaxy2Fragment - &gt;   GalaxyFragment - &gt; HomeFragment类。

任何人都可以给我建议如何在这些类型的案例上处理这些Backbutton片段。欢迎提出建议。感谢。

4 个答案:

答案 0 :(得分:1)

您正在将addtobackstack设置为null。相反,您应该编写替换片段的TAG名称。

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

而不是

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

答案 1 :(得分: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 - &gt; FragmentB - &gt; FragmentA。

为此,您只需使用fragmentTransaction.addToBackstack(fragment.toString);  在提交之前...然后在你的活动中覆盖onBackPress:

@Override
    public void onBackPressed() {

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

            mFragmentManager.popBackStackImmediate();
        }
    }

请确保您没有为&#34; Case1&#34;提及上述方法。在提交这3个片段之前

答案 2 :(得分: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。

答案 3 :(得分:0)

尝试这样的事情......

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

        } else {
            finish();
        }
}