Android FragmentManager对于相同的Activity hide()不起作用

时间:2015-05-07 17:23:40

标签: android hide show fragmentmanager

大家好我正在研究我的MainActivity,我正在处理以下问题:

在我的MainActivity中,我有3个按钮(button1,button2,button3)。每个我都可以在我的容器中添加Fragment(Fragment2, Fragment1, ProfileFragment)。每次按下按钮时,如果已经有另一个可见,它会检查碎片。

如果是,FragmentManager().beginnTransaction().fragment.hide()应隐藏它。

然后检查绑定到按钮的片段是否已存在。

如果不是,则添加它。

如果是,则应使用FragmentManager().beginnTransaction().fragment.show()

再次显示现有的隐藏片段

现在:如果我在启动应用程序时按button2作为第一个,一切正常,我可以在片段之间无限切换。

但是:如果我按button1作为第一个,然后切换到button2button3,则片段绑定到button1({{1} }}无法再次显示。它只显示m2fragment(当我按m1fragment时应该隐藏它)

如果我按下按钮3作为第一个,也会发生同样的情况。每当我尝试切换回button1button3)时,它只显示m1fragment。

googleMap可能存在问题,我从profileFragment的xml调用了吗?

任何人都可以看到我犯了哪些(a)错误?我很高兴,因为我现在正处理这个问题好几天了。

谢谢大家!

从我的MainActivity剪切:

m2Fragment

mProfileFragment和m2Fragment同样使用onCreate和onCreateView方法:

public class MainActivity extends FragmentActivity implements ProfileFragment.OnFragmentInteractionListener,
        OfferFragment.OnFragmentInteractionListener, MapsFragment.OnFragmentInteractionListener, OpenerFragment.OnFragmentInteractionListener, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {


    private GoogleApiClient mGoogleApiClient;

    protected int fragment1Open = 0;
    protected int fragment2Open = 0;
    protected int profileFragmentOpen = 0;
    Fragment1 m1Fragment = new Fragment1();
    Fragment2 m2Fragment = new Fragment2();
    ProfileFragment mProfileFragment = new ProfileFragment();
    OpenerFragment mOpenerFragment = new OpenerFragment();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState==null) {
            getFragmentManager().beginTransaction().add(R.id.container,mOpenerFragment).commit();
        }

        final Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //check fragments
                if(mOpenerFragment.isVisible()) {
                    getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
                    Log.d("button1", "remove OpenerFragment");
                }
                if(m1Fragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(m1Fragment).commit();
                }
                if(mProfileFragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(mProfileFragment).commit();
                }

                if(fragment2Open==0) {
                    fragment2Open=1;
                    getFragmentManager().beginTransaction().add(R.id.container, m2Fragment).commit();
                } else {
                    getFragmentManager().beginTransaction().show(m2Fragment).commit();
                }

            }
        });

        final Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //hide other fragments
                if(mOpenerFragment.isVisible()) {
                    getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
                }
                if(mProfileFragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(mProfileFragment).commit();
                }
                if(m2Fragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(m2Fragment).commit();
                }

                if(fragment1Open==0) {
                    fragment1Open=1;
                    getFragmentManager().beginTransaction().add(R.id.container, m1Fragment).commit();
                } else {
                    getFragmentManager().beginTransaction().show(m1Fragment).commit();
                }

            }
        });

        final Button button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //hide other fragments
                if(mOpenerFragment.isVisible()) {
                    getFragmentManager().beginTransaction().remove(mOpenerFragment).commit();
                }
                if(m1Fragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(m1Fragment).commit();
                }
                if(m2Fragment.isVisible()) {
                    getFragmentManager().beginTransaction().hide(m2Fragment).commit();
                }

                //open fragment
                if(profileFragmentOpen==0) {
                    profileFragmentOpen=1;
                    getFragmentManager().beginTransaction().add(R.id.container, mProfileFragment).commit();
                } else {
                    getFragmentManager().beginTransaction().show(mProfileFragment).commit();
                }
            }
        });

m1Fragment具有相同的方法,但从其xml文件中获取googleMaps片段。

m1Fragment:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.fragment_profile, container, false);
        return rootview;
    }

fragment_1.xml:     

    public class Fragment1 extends Fragment implements OnMapReadyCallback {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            MapFragment mapFragment=(MapFragment) getFragmentManager().findFragmentById(mapid);
            if (mapFragment==null) {
                mapFragment = MapFragment.newInstance();
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.add(R.id.container, mapFragment);
                fragmentTransaction.commit();

                mapFragment.getMapAsync(this);
            }
            mapFragment.getMapAsync(this);
        }


        @Override
        public void onMapReady(GoogleMap map) {
            //right upper corner, location layer activated
            map.setMyLocationEnabled(true);

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_maps, container, false);

            return rootView;
        }

3 个答案:

答案 0 :(得分:1)

MapFragment mapFragment=(MapFragment) getFragmentManager().findFragmentById(mapid);

在这一行中您实际上要获取父级的fragmentManager(在您的情况下是活动),并且无法找到该片段。 然后在这一行:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.container, mapFragment);
            fragmentTransaction.commit();

您要添加到父FragmentManager。

快速解决方案是用getChildFragmentManager替换getFragmentManger(),它引用片段的FragmentManager。

答案 1 :(得分:0)

也许你应该尝试使用:

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

在您的活动中将fragment_container作为FrameLayout吗?

我不是百分百肯定,但我认为它会避免此类问题

答案 2 :(得分:0)

我刚刚解决了它:

在我的div课程中,我实例化了一个googleMaps片段"两次"。试图隐藏MapsFragment我只隐藏了其中一个,让另一个可见在前面。

对于在此处遇到类似问题的人,我的解决方案: 我删除了

mapFragment

来自xml布局文件。

<fragment android:id="@id/mapid" class="com.google.android.gms.maps.MapFragment"/> 课程内我改变了

MapsFragment

MapFragment mapFragment=(MapFragment) getChildFragmentManager().findFragmentById(mapid);

现在我将一个干净的MapFragment实例放入我的FrameLayout中,它可以正常工作。