Fragment跳转问题

Fragment跳转问题

为什么用第一次使用replace转换Fragment的时候会出现空白页,要多点一次才出现需要的Fragment


MainActivity的代码如下:

package com.example.imooc.shopping;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import com.example.imooc.shopping.Fragment.MainFragment;
import com.example.imooc.shopping.Fragment.MeFragment;
import com.example.imooc.shopping.Fragment.ShopFragment;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    protected MainFragment mainFragment=new MainFragment();
    protected MeFragment meFragment=new MeFragment();
    protected ShopFragment shopFragment=new ShopFragment();

    protected LinearLayout menuMain,menuMe,menuShop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getSupportFragmentManager().beginTransaction()
                .add(R.id.container_content,mainFragment)
                .add(R.id.container_content,meFragment).hide(meFragment)
                .add(R.id.container_content,shopFragment).hide(shopFragment)
                .commit();
        intent();
    }


    private void intent() {
        menuMain=this.findViewById(R.id.menu_main);
        menuMain.setOnClickListener(this);
        menuMe=this.findViewById(R.id.menu_me);
        menuMe.setOnClickListener(this);
        menuShop=this.findViewById(R.id.menu_shop);
        menuShop.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.menu_main:
                this.getSupportFragmentManager().beginTransaction()
                        .replace(R.id.container_content,mainFragment).commit();
                break;
            case R.id.menu_me:
                this.getSupportFragmentManager().beginTransaction()
                        .replace(R.id.container_content,meFragment).commit();
                break;
            case R.id.menu_shop:
                this.getSupportFragmentManager().beginTransaction()
                        .replace(R.id.container_content,shopFragment).commit();
                break;
        }
    }
}

还有我看提问里面有老师说可以用FragmentList来帮助使用show,hide来显示Fragment,需要遍历FragmentList来判断Fragment是否展示或隐藏,那怎么判断它是展示还是隐藏,这些都没接触过啊,具体是需要怎么写?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

1、replace()操作时是先移除所有同内容id的fragment,再添加传入fragment对象。所以导致其他fragment是空的,你可以使用加载时一次性把所有fragment都add进去,之后再点击就使用show()或者hide()即可。

2、如果你是想判断fragment的隐藏状态,当Fragment配合ViewPager使用时,可以使用setUserVisibleHint()来判断。当Fragment配合FragmentTransition使用时,可以使用onHiddenChanged()来判断。你也可以把提问的部分截图贴出来方便老师结合具体环境来为你解答。

  • 进击的牙套仔 提问者 #1
    但是如果用了show,hide就不能使用replace了吧,之前也想过用show,hide的方式,但是在shopFragment按back切换回mainFragment就不知道怎么切换了,因为show,hide使用的Fragment参数都是在mainActivity中创建的,我试过在shopFragment的java文件中创建MainActivity的对象,尝试用这个对象调用里面的三个Fragment,编译没有报错,但是在虚拟机上却报栈溢出了,这可怎么办?还有,如果一定要用replace的话,是否就不能解决空白页这个问题了?
    2018-10-15 22:03:17
  • irista23 回复 提问者 进击的牙套仔 #2
    如果你要用replace(),在onCreate()里使用FragmentTransaction的add(R.id.container,new MainFragment()).commit();只添加主的fragment。点击底部菜单再使用replace()进行内容id的替换。返回跳转,可以直接利用startActivity()跳转到主activity
    2018-10-16 09:52:22
  • 进击的牙套仔 提问者 回复 irista23 #3
    可以了,非常感谢
    2018-10-16 22:16:25
提问者 进击的牙套仔 2018-10-12 21:40:36

我再将问题描叙清楚一点,当登录进去后可以显示主界面,如下图


http://img1.sycdn.imooc.com//climg/5bc0a2460001241104760794.jpg


然后点击购物,这是第一次跳转,就会出现空白页,如下图


http://img1.sycdn.imooc.com//climg/5bc0a27d0001658604760794.jpg


这个时候无论如何点击购物,都不会出现对应的Fragment,只有点击了用户或者首页才会出现,相应的如果第一次点击用户,也会出现空白的Fragment,下图是第二次跳转后的用户页面


http://img1.sycdn.imooc.com//climg/5bc0a2b30001f0f904760794.jpg


然后再点回购物,对应的Fragment又会重新出现,如下图


http://img1.sycdn.imooc.com//climg/5bc0a2f00001357e04760794.jpg


真的非常奇怪,查百度都没找到相关的文档或者博客文章,还有个现象就是,当我登录进到主界面的时候,如果第一次点击的是地图Fragment,也就是北京隔壁的按钮,对应的地图Fragment又会正常弹出,再点击购物或者用户的时候,对应的Fragment也可以正常弹出,太奇怪了,左右就差这个问题就可以提交了,麻烦老师了


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师