如何在没有backstack的情况下从活动微调器中替换片段

时间:2017-04-27 08:57:53

标签: android android-activity fragment spinner

我有一个活动,其中包含appbar中的微调控件。在homeActivity我使用的片段有默认片段作为parentoptionfragment,从该片段有3个选项来更改片段,如果我从parentoption片段中选择一个片段,我想更改微调器值,那么片段应该更新而不添加到backstack意味着如果我按下后退按钮然后它应该调用父选项碎片,但是当我试图这样做时我会收到错误。

    public void GetChildData(String token) {
    ParentOptionsFragment fragment =new ParentOptionsFragment();
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
    }

@Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            tv_childClassname.setText(classNameArr[position]);
            tv_childSchoolName.setText(schoolNameArr[position]);

            Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
            if (f instanceof ChildMapFragment){
                Toast.makeText(HomeActivity.this, "refreshing childmapfragment", Toast.LENGTH_SHORT).show();

                ChildMapFragment fragment = new ChildMapFragment();
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.popBackStackImmediate (fragment.getClass().getName(), 0);
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, fragment);
                fragmentTransaction.commit();
            }else if(f instanceof ParentOptionsFragment){
                Toast.makeText(HomeActivity.this, "spinner changed from ParentOptionsFragment", Toast.LENGTH_SHORT).show();

            }
        }

parentoptionfragment.java

public class ParentOptionsFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_parent_options, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        final ImageView img1=(ImageView)view.findViewById(R.id.imageView);
        ImageView img2=(ImageView)view.findViewById(R.id.imageView2);
        ImageView img3=(ImageView)view.findViewById(R.id.img_transport);

        img3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChildMapFragment fragment = new ChildMapFragment();
                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, fragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
        /*final ViewTreeObserver vto = img1.getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            public boolean onPreDraw() {
                int x;
                img1.getViewTreeObserver().removeOnPreDrawListener(this);
                x = img1.getMeasuredWidth();
                img1.setLayoutParams(new LinearLayout.LayoutParams(x,x));
                return true;
            }
        });*/
    }
}

childfragment.java

public class ChildFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_child_map, container, false);
    }
}

homeActivity ---&gt; defaultfragment-- parentoptionfragment parentoptiofragment ---&GT; childfragment 使用spinner更新childfragment而不使用backstack onchress of childfragment - &gt; parentoptionfragment

2 个答案:

答案 0 :(得分:1)

替换

Toast.makeText(HomeActivity.this,&#34; refresh childmapfragment&#34;,Toast.LENGTH_SHORT).show();

            ChildMapFragment fragment = new ChildMapFragment();
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.popBackStackImmediate (fragment.getClass().getName(), 0);
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();

with:

FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.popBackStack()

更新: 在您的子片段上添加一个方法:update()并将其命名为:

FragmentManager fragmentManager = getSupportFragmentManager();
           Fragment  fragment = fragmentManager.findFragmentById(R.id.fragment_container)
    if(fragment isInstanceOf ChildMapFragment ){
    ((ChildMapFragment )fragment).update() //call your update method here
    }

答案 1 :(得分:0)

FragmentManager fragmentManager = getSupportFragmentManager();
        //    String f_name=fragment.getClass().getName();
        if (!fragmentManager.popBackStackImmediate(tag, 0)) {

            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.replace(R.id.content_frame, fragment, tag);
            ft.addToBackStack(tag);
            ft.commit();

        }

在这样的活动中刷新片段实现后栈

   @Override
    public void onBackStackChanged() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fr = fragmentManager.findFragmentById(R.id.content_frame);
        if (fr != null) {
            fr.onResume();
        }
    }

这里根据不同的片段传递不同的标签