【问题标题】:Fragments inside ViewPager dissapear when orientation changesViewPager 中的片段在方向改变时消失
【发布时间】:2015-07-23 13:22:02
【问题描述】:

我已经阅读了几篇关于此的帖子(http://tinyurl.com/pb8es74http://tinyurl.com/p9pcfcv..。)但找不到解决方案。

我有一个 MainActivity,它加载一个包含 ViewPager 的布局,其中包含三个片段(根据方向具有不同的布局)。

我已将此功能添加到活动中,因此当方向更改时它不会被破坏,因为我可能打开了一些对话框或弹出窗口:

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|uiMode"

因此,我重写了方法“onConfigurationChanged”,它只调用了方法 loadLayout,所有关于视图的内容都在此生成:

 private void loadLayout() {
    setContentView(R.layout.layout_main_activity);

    pager = (ViewPager) this.findViewById(R.id.pager);
    pager.setPageTransformer(true, new DepthPageTransformer());

    adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(Fragment1.getInstance());
    adapter.addFragment(Fragment2.getInstance());
    adapter.addFragment(Fragment3.getInstance());

    pager.setAdapter(adapter);
    pager.setOffscreenPageLimit(2);

    //Media controllers
    imgMediaController= (ImageButton) findViewById(R.id.media_controller);

    imgMediaController.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            [...]
        }
    });

    imgVolumeController= (ImageButton) findViewById(R.id.volume_controller);
    gM.setImgVolumeController(imgVolumeController);

    imgVolumeController.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            [...]
        }
    });
}

片段的代码是相等的:

public class FragmentNature extends Fragment {

private static FragmentNature instance;
private SoundManager sM;
private View rootView;
Hashtable<String, ImageButton> h_Images;
private Handler repeatUpdateHandler = new Handler();
private Toast volumeToast;


public static FragmentNature getInstance() {
    if (instance == null)
        instance = new FragmentNature();
    return instance;
}

public void nullInstance() {
    instance=null;
}

public FragmentNature(){
    h_Images=new Hashtable<String,ImageButton>();
}

public void onCreate(Bundle savedInstanceState) {
    Log.d("Naturing", "On create->Estoy en el fragment nature");
    super.onActivityCreated(savedInstanceState);
    sM=SoundManager.getInstance();
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    rootView=null;
    Log.d("Naturing", "On createView->Estoy en el fragment nature");
    rootView = inflater.inflate(R.layout.fragment_nature, container, false);

    final ImageButton imgRain= (ImageButton) rootView.findViewById(R.id.n_rain);
    h_Images.put("n_rain",imgRain);
    imgRain.setImageResource(R.drawable.n_rainsel);

    final ImageButton imgRiver= (ImageButton) rootView.findViewById(R.id.n_river);
    imgRiver.setImageResource(R.drawable.n_riversel);

    final ImageButton imgWave= (ImageButton) rootView.findViewById(R.id.n_wave);
    h_Images.put("n_wave",imgWave);
    imgWave.setImageResource(R.drawable.n_wavesel);

    final ImageButton imgWind= (ImageButton) rootView.findViewById(R.id.n_wind);
    h_Images.put("n_wind", imgWind);
    imgWind.setImageResource(R.drawable.n_windsel);

    final ImageButton imgFire= (ImageButton) rootView.findViewById(R.id.n_fire);
    h_Images.put("n_fire", imgFire);
    imgFire.setImageResource(R.drawable.n_firesel);

    final ImageButton imgTree= (ImageButton) rootView.findViewById(R.id.n_tree);
    h_Images.put("n_tree", imgTree);
    imgTree.setImageResource(R.drawable.n_treesel);

    final ImageButton imgStorm= (ImageButton) rootView.findViewById(R.id.n_storm);
    h_Images.put("n_storm", imgStorm);
    imgStorm.setImageResource(R.drawable.n_stormsel);

    final ImageButton imgDrop= (ImageButton) rootView.findViewById(R.id.n_drop);
    h_Images.put("n_drop", imgDrop);
    imgDrop.setImageResource(R.drawable.n_dropsel);

    final ImageButton imgDeepSea= (ImageButton) rootView.findViewById(R.id.n_deepsea);
    h_Images.put("n_deepsea", imgDeepSea);
    imgDeepSea.setImageResource(R.drawable.n_deepseasel);

    return rootView;
}

private boolean isNetworkAvailable(){
    Context context=ApplicationManager.getAppContext();
    ConnectivityManager connectivityManager=
            (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo= connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

public void changeImageStatus(String sound, int imgId){
    Log.d("Naturing", "FragmentNature::changeImageStatus  | sound= " + sound + "  imgId=" + imgId);
    h_Images.get(sound).setImageResource(imgId);
}

}

问题是当方向改变时,mainActivity布局正确加载,而viewPager却没有。事实上,它消失了,取而代之的是什么也看不到。无论如何,viewPager 就在那里,因为我能够通过它并到达终点(我知道这一点是因为当您到达菜单的末尾时我可以看到蓝色标志等等)。

我也尝试调用片段的 OncreateView 方法,但没有任何变化。

有什么想法吗? 谢谢和亲切的问候

编辑 1

如果我取出“pager.setOffscreenPageLimit(2);”,在方向改变后,当我滚动viewpager一段时间时,片段1和片段3是可见的,但片段2无论如何都不会出现。我知道这并不多,但万一它给任何人一个提示。

编辑 2

如果我在 Manifest 中取出该行,它可以正常工作,因为它调用 MainActivity 和 Fragment 的 onCreateView。但我需要清单中的那一行。

【问题讨论】:

  • 我可以知道你为什么使用DepthPAgeTransformer...并发布你的片段代码
  • 我只是在滚动寻呼机时使用它来制作一些特殊事件。我删除了它,但我仍然有问题
  • 将rootview创建为全局对象有什么需要以及为什么将其设置为null。
  • 我检查了其他两个,它们都可以,我不知道为什么我会这样。无论如何,这与问题无关。还有其他想法吗?
  • 将其设为本地对象,然后再试一次可能会奏效

标签: android android-layout android-fragments android-viewpager android-orientation


【解决方案1】:

最后我用 DialogFragments 做到了,因为我需要继续。 无论如何,如果有人知道如何按照我在问题中解释的方式解决问题以供未来发展,那就太好了。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多