2012-12-14 63 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