2012-12-14 57 views
11

我面臨的問題如下: 在主屏幕上,我有3個按鈕:配置,主要,設置。當從其他片段返回時不顯示(恢復)Viewpager片段

  • 單擊每個按鈕時,將顯示相應的片段以在FrameLayout中擴展布局。
  • 當用戶在Config或Setting Fragment中時,可以使用onBackpressed返回到主片段,或者單擊Main按鈕。當用戶在主片段中時,如果用戶點擊返回,彈出窗口顯示確認退出。

在主片段中,我放了一個viewpager。在這個viewpager裏面,我放了2個其他片段,每個片段都包含一個圖像網格(我還使用了圓圈指示器來查看頁面底部的變化)。爲簡單起見,Config Fragment和Setting Fragment僅在中心顯示文本。當應用程序啓動時,通常顯示主要片段,當我點擊Setting或Config按鈕時,它通常顯示相應的片段。問題是當點擊後退按鈕(在Android上)時,它會返回到主片段,但viewpager內沒有片段。它顯示空的屏幕。

Main fragment- fragment 1 in viewpager is shown Main fragment - fragment 2 in viewpager is shown Config fragment Setting fragment Go back to main fragment from config/setting fragment

也許我錯了,當過程會從配置回/設置片段主要片段。如果主要片段只是在沒有viewpager的情況下膨脹某個佈局,則問題不會發生。當從配置/設置片段返回主片段時如何恢復viewpager的狀態?我附上我的代碼,以便您可以給我更明確的答案。非常感謝你的回答。

package com.example.testfragmentviewpager; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.FrameLayout; 

import com.example.viewpageindicator.CirclePageIndicator; 
import com.example.viewpageindicator.PageIndicator; 

public class MainActivity extends FragmentActivity { 

    Fragment configFragment; 
    Fragment settingFragment; 
    Fragment mainItemsFragment; 
    FrameLayout frmLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.main); 

     if (savedInstanceState == null) { 
      FragmentManager fm = getSupportFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      frmLayout = (FrameLayout) findViewById(R.id.frame_cotainer); 
      mainItemsFragment = new MainItemsFragment(); 
      ft.add(R.id.frame_cotainer, mainItemsFragment, "mainItems").commit(); 
     } 

     addListener(R.id.btnConfig); 
     addListener(R.id.btnMain); 
     addListener(R.id.btnSetting); 

    } 

    public void addListener(int buttonID) { 
     final Button btn = (Button) findViewById(buttonID); 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showFragment(btn); 
      } 
     }); 
    } 

    public void showFragment(View v) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     switch (v.getId()) { 
      case R.id.btnConfig: 
       if (configFragment == null) { 
        configFragment = new ConfigListFragment(); 
       } 
       else if (configFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, configFragment, "config"); 

       break; 
      case R.id.btnMain: 
       if (mainItemsFragment == null) 
        mainItemsFragment = new MainItemsFragment(); 
       if (getCurrentEntriesInBackStack() == 0) 
        return; 
       else { 
        if (configFragment != null && configFragment.isVisible()) { 
         ft.detach(configFragment); 
         configFragment = null; 
        } 
        if (settingFragment != null && settingFragment.isVisible()) { 
         ft.detach(settingFragment); 
         settingFragment = null; 
        } 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        removeFromContainer(ft); 
        callPopBackStack(); 
        return; 
       } 
      case R.id.btnSetting: 
       if (settingFragment == null) 
        settingFragment = new SettingFragment(); 
       else if (settingFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, settingFragment, "setting"); 
       break; 
      default: 
       break; 
     } 

     ft.commit(); 
    } 

    private int getCurrentEntriesInBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 
     return fm.getBackStackEntryCount(); 
    } 

    private boolean callPopBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 

     boolean result = fm.popBackStackImmediate(); 
     return result; 
    } 

    private void removeFromContainer(FragmentTransaction ft) { 
     if (configFragment != null && configFragment.isVisible()) { 
      ft.detach(configFragment); 
      configFragment = null; 
     } 
     if (settingFragment != null && settingFragment.isVisible()) { 
      ft.detach(settingFragment); 
      settingFragment = null; 
     } 
     ft.commit(); 
    } 

    public static class ConfigListFragment extends Fragment { 

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

    public static class SettingFragment extends Fragment { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.layout_setting, container, false); 
      return v; 
     } 

    } 

    public static class MainItemsFragment extends Fragment { 

     private MyPagerAdapter adapter; 
     private ViewPager viewpager; 
     private PageIndicator mIndicator; 
     View rootView; 

     private class setAdapterTask extends AsyncTask<Void, Void, Void> { 
      protected Void doInBackground(Void... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       viewpager.setAdapter(adapter); 
       mIndicator = (CirclePageIndicator) rootView.findViewById(R.id.indicator); 
       mIndicator.setViewPager(viewpager); 

       viewpager.setCurrentItem(0); 

      } 
     } 

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

      adapter = new MyPagerAdapter(getFragmentManager()); 
      viewpager = (ViewPager) rootView.findViewById(R.id.myviewpager); 
      new setAdapterTask().execute(); 
      return rootView; 
     } 

    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int index) { 
      if (index == 0) { 
       return new MainFragment1(); 
      } 
      else { 
       return new MainFragment2(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 
    } 

    @Override 
    public void onBackPressed() { 

     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     removeFromContainer(ft); 
     if (fm.popBackStackImmediate()) { 
      return; 
     } 

     else { 

      AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); 
      dlg.setTitle("Confirm Exit"); 
      dlg.setMessage("Do you want to exit?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        MainActivity.this.finish(); 
       } 

      }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

      AlertDialog alertDlg = dlg.create(); 
      alertDlg.show(); 
     } 
    } 

} 

回答

16

它看起來像你正在使用其中一個老黑客來嵌入碎片。我建議你先升級到最新的Android支持庫,即。版本11。然後看看如何使用兒童片段管理器http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()

我有一個關於如何嵌套與viewpager片段的github上的例子。

+3

感謝Marco對您的建議。我剛剛將Android支持庫更新爲Re。 11並將getChildFragmentManager()傳遞給viewpager的構造函數,但仍然沒有運氣。當我從設置/配置片段返回時,主片段中的viewpager仍爲空。用戶從設置/配置片段I返回時的過程如下(詳見嵌入代碼showFragment的功能): 1 /設置/配置片段的分離UI; 2 /從背部堆棧獲取主要碎片 從背部堆棧獲取主要碎片是否出錯? – zungnv

+0

這適用於我,投票:) :) –

+0

爲我工作!謝謝你,兄弟! – NemesisDoom