簡體   English   中英

當方向改變時,ViewPager中的碎片消失

[英]Fragments inside ViewPager dissapear when orientation changes

我已經閱讀了幾篇關於此的帖子( http://tinyurl.com/pb8es74,http://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。 但是我需要清單中的那一行。

最后我用DialogFragments做了,因為我需要繼續。 無論如何,如果有人知道如何以我在未來發展的問題中解釋的方式解決問題,那就太棒了。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM