安卓:动作条,TabListener和support.v4.Fragment [英] Android: ActionBar, TabListener and support.v4.Fragment

查看:180
本文介绍了安卓:动作条,TabListener和support.v4.Fragment的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我建设与 MainActivity 一个应用程序,它扩展了 FragmentActivity ,并与三个选项卡的动作条。在每个选项卡,我想附加 ParentFragment 应控制内部页面之间轻扫。其结果应该是pressing选项卡,用户应该改变从 ParentFragment 的不同实例和刷卡,他应在各 TextViewFragments修改里面的每个 ParentFragment
现在我可以完全的三个选项卡之间进行切换,但问题是, ParentFragment 未正确显示,好像它甚至没有创建,因为我甚至不能看到的onCreate() onCreateView() onViewCreated()功能在LogCat中查看。
我认为问题在于自定义TabListener类和它的功能,但我实在无法理解的问题是什么。我试图寻找在许多网站,我已经研究过很多例子,但他们没有被涉及到了同样的情况。
我怎么会错过或我在做什么错在这里?

这是我MainActivity:

 导入了java.util.Random;
    进口android.app.ActionBar;
    进口android.app.ActionBar.Tab;
    进口android.graphics.drawable.Drawable;
    进口android.os.Bundle;
    进口android.support.v4.app.Fragment;
    进口android.support.v4.app.FragmentActivity;
    进口android.support.v4.app.FragmentTransaction;
    进口android.support.v4.view.ViewPager;
    进口android.view.Gravity;
    进口android.view.LayoutInflater;
    进口android.view.Menu;
    进口android.view.MenuItem;
    进口android.view.View;
    进口android.view.ViewGroup;
    进口android.widget.TextView;
    进口android.widget.Toast;
    进口com.viewpagerindicator.PageIndicator;

公共类MainActivity扩展FragmentActivity {

    MyAdapter mAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;
    私人查看mCustomView;
    私有静态最后随机RANDOM =新的随机();

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        //设置操作栏。
        ActionBar.LayoutParams PARAMS =新ActionBar.LayoutParams(
                ActionBar.LayoutParams.MATCH_PARENT,
                ActionBar.LayoutParams.MATCH_PARENT,Gravity.CENTER);
        最后的动作条动作条= getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(假);
        actionBar.setDisplayUseLogoEnabled(假);
        actionBar.setDisplayShowHomeEnabled(假);


            actionBar.addTab(动作条
                    。新标签()
                    .setIcon(调用getIcon(0,真))
                    .setTabListener(
                            新TabListener< ParentFragment>(这一点,家,
                                    ParentFragment.class)));

            actionBar.addTab(动作条
                    。新标签()
                    .setIcon(调用getIcon(1,FALSE))
                    .setTabListener(
                            新TabListener< ParentFragment>(这一点,应用程序,
                                    ParentFragment.class)));

            actionBar.addTab(动作条
                    。新标签()
                    .setIcon(调用getIcon(2,FALSE))
                    .setTabListener(
                            新TabListener< ParentFragment>(这一点,设置,
                                    ParentFragment.class)));

    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){

    }


    公共静态类TabListener<吨延伸片断>器物
            ActionBar.TabListener {

        私人片段mFragment;
        私人最终FragmentActivity mActivity;
        私人最终字符串MTAG;
        私人最终类别< T> mClass;
        私人最终捆绑mArgs;
        私人FragmentTransaction FFT;
            公共静态最终字符串变量= TabListener.class.getSimpleName();

        公共TabListener(FragmentActivity活动,字符串变量,类< T> CLZ){

            这(活动,吊牌,CLZ,NULL);
        }

        公共TabListener(FragmentActivity活动,字符串变量,类< T> CLZ,
                捆绑参数){

            mActivity =活动;
            MTAG =标签;
            mClass = CLZ;
            mArgs = ARGS;

            mFragment = mActivity.getSupportFragmentManager()
                    .findFragmentByTag(MTAG);
            如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){

                FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
                fft.detach(mFragment);
                fft.commit();
            }
        }

        公共无效onTabSelected(TAB键,android.app.FragmentTransaction英尺){

            的System.out.println(TAG +( - )+ - > MTAG
                    + MTAG +入选!);
            FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。

            如果(mFragment == NULL){
                mFragment = Fragment.instantiate(mActivity,mClass.getName());

                fft.add(android.R.id.content,mFragment,MTAG);

            } 其他 {
                的System.out.println(TAG +( - )+ - >片段CON MTAG =+ MTAG
                        +已找到骗子的标签!);
                fft.attach(mFragment);
                fft.commit();
            }
        }

        @覆盖
        公共无效onTabReselected(TAB键,android.app.FragmentTransaction英尺){

        }

        @覆盖
        公共无效onTabUnselected(TAB键,android.app.FragmentTransaction英尺){

            mFragment = mActivity.getSupportFragmentManager()
                    .findFragmentByTag(MTAG);
            的System.out.println(TAG +( - )+ - > MTAG
                    + MTAG +未选定!);

            如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){
                FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
                fft.detach(mFragment);
                fft.commit();
            }
        }

    }

    公众可绘制调用getIcon(INT tabPosition,布尔选择){

        开关(tabPosition){
        情况下0:
            返回getResources()getDrawable(R.drawable.actionbar_home)。

        情况1:
            返回getResources()getDrawable(R.drawable.actionbar_apps)。

        案例2:
            返回getResources()getDrawable(R.drawable.actionbar_settings)。

        }
        返回null;
    }

}
 

这是我ParentFragment现在exteds的android.support.v4.app.Fragment类:

 进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.view.ViewPager;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口com.viewpagerindicator.IconPageIndicator;
进口com.viewpagerindicator.PageIndicator;

公共类ParentFragment扩展片段{

    公共静态最终字符串变量= ParentFragment.class.getSimpleName();

    MyAdapter fragmentAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;



    公共静态ParentFragment的newInstance(){
 的System.out.println(TAG + - 的newInstance());
    的System.out.println(TAG + - +方法名());
        ParentFragment片段=新ParentFragment();
        返回片段;
    }

    @覆盖
    公共无效的onCreate(包savedInstanceState){
的System.out.println(TAG + - 的onCreate());
        的System.out.println(TAG + - +方法名());

        super.onCreate(savedInstanceState);
        setRetainInstance(真正的);

    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){

的System.out.println(TAG + -  onCreateView());
        的System.out.println(TAG + - +方法名());
        fragmentAdapter =新MyAdapter(getFragmentManager());

        查看查看= inflater.inflate(R.layout.simple_icons,集装箱,假);
        mPager =(ViewPager)view.findViewById(R.id.pager);
        mPager.setAdapter(fragmentAdapter);

        返回查看;
    }

    @覆盖
    公共无效onViewCreated(查看视图,捆绑savedInstanceState){
        的System.out.println(TAG + -  onViewCreated());
        的System.out.println(TAG + - +方法名());
        super.onViewCreated(查看,savedInstanceState);

        mIndicator =(IconPageIndicator)getActivity()findViewById(R.id.indicator)。
        mIndicator.setViewPager(mPager);
    }
}
 

这是MyAdapter类:

 进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentManager;
进口android.support.v4.app.FragmentTransaction;
进口android.support.v4.view.PagerAdapter;
进口android.view.View;
进口android.view.ViewGroup;
进口com.viewpagerindicator.IconPagerAdapter;

公共类MyAdapter扩展PagerAdapter {

    FragmentManager myFragmentMgr;
    私人FragmentTransaction mCurTransaction;

    受保护的静态最终的String [] CONTENT =新的String [] {此,是,A,测试,};
    受保护的静态最终诠释[]图标=新INT [] {
            R.drawable.icon_page_indicator,
            R.drawable.icon_page_indicator,
            R.drawable.icon_page_indicator,
            R.drawable.perm_group_calendar,
            R.drawable.perm_group_camera,
            R.drawable.perm_group_device_alarms,
            R.drawable.perm_group_location
    };

    私人诠释mCount = CONTENT.length;

    公共MyAdapter(FragmentManager FM){
        超();
        myFragmentMgr = FM;
    }

    @覆盖
    公众诠释getCount将(){

        返回3;
    }

    @覆盖
    公共对象instantiateItem(ViewGroup中的ViewGroup,INT位置){

        ParentFragment片段= ParentFragment.newInstance();
        返回片段;
    }

    @覆盖
    公共无效destroyItem(ViewGroup中的ViewGroup,INT位置,对象OBJ){

        如果(mCurTransaction == NULL){
            mCurTransaction = myFragmentMgr.beginTransaction();
        }
        mCurTransaction.detach((片段)OBJ);
    }

    @覆盖
    公共布尔isViewFromObject(查看为arg0,对象ARG1){
        返回false;
    }

    公共片段的getItem(INT位置){
        捆绑的args =新包();
        args.putInt(TextViewFragment.POSITION_KEY,位置);
        返回TextViewFragment.newInstance(参数);
    }

    @覆盖
    公共CharSequence的getPageTitle(INT位置){

        回归片段#+位置;
    }

    公众诠释getIconResId(INT指数){

        返回图标[索引%ICONS.length]。
    }

     公共无效setCount(诠释计数){
            如果(计数大于0和放大器;&安培; COUNT< = 10){
                mCount =计数;
                notifyDataSetChanged();
            }
        }
}
 

和最后的TextViewFragment类:

 进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.view.ViewGroup;
进口android.widget.TextView;
进口android.widget.Toast;

公共类TextViewFragment扩展片段{

    公共静态最后弦乐POSITION_KEY =POSITION;
    公共静态最后弦乐TITLE_KEY =TITLE;

    公共静态TextViewFragment的newInstance(捆绑的args){
        TextViewFragment片段=新TextViewFragment();
        fragment.setArguments(参数);
        返回片段;
    }

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        返回inflater.inflate(R.layout.fragment_test,集装箱,假);
    }

    @覆盖
    公共无效onViewCreated(查看视图,捆绑savedInstanceState){
        super.onViewCreated(查看,savedInstanceState);

        TextView中的TextView =(TextView中)view.findViewById(R.id.textViewPosition);
        最终诠释地位;
        如果(getArguments()!= NULL){
            位置= getArguments()调用getInt(POSITION_KEY)。
            textview.setText(Integer.toString(位置));
        } 其他 {
            位置= 0;
            textview.setText(儿童片);
        }

        textview.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){

                Toast.makeText(v.getContext(),点击位置:+位置,
                        Toast.LENGTH_LONG).show();
            }
        });
    }
}
 

-----编辑:解决方案-----

我不能回答我的问题,由于低信誉,但我无论如何共享的解决方案,以帮助别人,希望能够恢复一些选票。

我终于找到了做事情的工作为我的方式,我希望这可以成为其他人遇到同样的问题有所帮助。 正如我怀疑,问题是TabListener。我的问题解决了不断变化的那部分与该code:

 公共静态类TabListener<吨延伸片断>器物
            ActionBar.TabListener {
    私人片段mFragment;
    私人最终FragmentActivity mActivity;
    私人最终字符串MTAG;
    私人最终类别< T> mClass;
    私人最终捆绑mArgs;
    私人FragmentTransaction FFT;

    公共TabListener(FragmentActivity活动,字符串变量,类< T> CLZ){

        这(活动,吊牌,CLZ,NULL);
    }

    公共TabListener(FragmentActivity活动,字符串变量,类< T> CLZ,
            捆绑参数){

        mActivity =活动;
        MTAG =标签;
        mClass = CLZ;
        mArgs = ARGS;

        的System.out.println(TAG + - +方法名()+ -  TabListener的构造 - > MTAG =
                + MTAG);
        //检查,看看是否已经有此标签的片段,可能
        //从previously保存的状态。如果是这样,禁用它,因为我们
        //初始状态是一个选项卡不显示。
        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(MTAG);
        如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){

            FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
            fft.detach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }

    公共无效onTabSelected(TAB键,android.app.FragmentTransaction英尺){

        片段TMP = mActivity.getSupportFragmentManager()
                .findFragmentByTag(MTAG);

        FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。

        如果(mFragment == NULL){

            的System.out.println(TAG + - +方法名()+ - 加mFragment+ MTAG);
            //如果没有,实例化并把它添加到活动
            mFragment = Fragment.instantiate(mActivity,mClass.getName());
            fft.add(android.R.id.content,mFragment,MTAG);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        } 其他 {
            的System.out.println(TAG + - +方法名()+ - 附加mFragment+ MTAG);
            //如果它存在,只需将它为了显示它
            fft.attach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }

    @覆盖
    公共无效onTabReselected(TAB键,android.app.FragmentTransaction英尺){
        的System.out.println(TAG + - +方法名()+ -  mFragment+ MTAG);

    }

    @覆盖
    公共无效onTabUnselected(TAB键,android.app.FragmentTransaction英尺){

        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(MTAG);

        如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){
            的System.out.println(TAG + - +方法名()+ - 分离mFragment+ MTAG);
            FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
            fft.detach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }



    公共静态最终字符串变量= TabListener.class.getSimpleName();
    私有静态最终诠释CLIENT_ code_STACK_INDEX;

    静态{
        //发现了这个code该指数在返回的堆栈跟踪 - 
        //滑稽,但它不同于在JDK 1.5和1.6
        INT I = 0;
        对于(StackTraceElement的STE:Thread.currentThread()的getStackTrace()){
            我++;
            如果(ste.getClassName()。等于(TabListener.class.getName())){
                打破;
            }
        }
        CLIENT_ code_STACK_INDEX =我;
    }

    公共静态字符串方法名(){

        如果(Thread.currentThread()的getStackTrace()长度LT; CLIENT_ code_STACK_INDEX)
            返回Thread.currentThread()的getStackTrace()[CLIENT_ code_STACK_INDEX]
                    .getMethodName()+();
        其他
            返回新的String(
                    方法名() - 堆栈跟踪指数超出绑定);
    }
}
 

最根本的区别是增加后,每提交()下面一行:

  mActivity.getSupportFragmentManager()executePendingTransactions()。
 

这个问题真的很糟糕记录,可能只发生在特定的条件下,但我希望这个解决方案可以节省一些时间给任何人有同样的问题!

解决方案

感谢您的回答,我有此相同的问题,支持库,其中的片段将被覆盖ontop对方当我试图标签之间切换

。有一对夫妇未使用的变量的解决方案,所以我清理了一下:

 公共静态类TabListener<吨延伸片断>实现ActionBar.TabListener {

  私人片段mFragment;
  私人最终FragmentActivity mActivity;
  私人最终字符串MTAG;
  私人最终类别< T> mClass;
  私人FragmentTransaction FFT;

  公共TabListener(FragmentActivity活动,字符串变量,类< T> CLZ){

      mActivity =活动;
      MTAG =标签;
      mClass = CLZ;

      //检查,看看是否已经有此标签的片段,可能
      //从previously保存的状态。如果是这样,禁用它,因为我们
      //初始状态是一个选项卡不显示。
      mFragment = mActivity.getSupportFragmentManager()findFragmentByTag(MTAG)。
      如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){

          FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager()
          .executePendingTransactions();
      }
  }

  @覆盖
  公共无效onTabSelected(TAB键,FragmentTransaction英尺){

      mFragment = mActivity.getSupportFragmentManager()findFragmentByTag(MTAG)。
      FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。

      如果(mFragment == NULL){

          //如果没有,实例化并把它添加到活动
          mFragment = Fragment.instantiate(mActivity,mClass.getName());
          ft.add(R.id.content_view,mFragment,MTAG);
          //fft.add(android.R.id.content,mFragment,MTAG);
          fft.commit();
          mActivity.getSupportFragmentManager()executePendingTransactions()。
      } 其他 {

          //如果它存在,只需将它为了显示它
          fft.attach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager()executePendingTransactions()。
      }
  }

  @覆盖
  公共无效onTabReselected(TAB键,FragmentTransaction英尺){

  }

  @覆盖
  公共无效onTabUnselected(TAB键,FragmentTransaction英尺){

      mFragment = mActivity.getSupportFragmentManager()findFragmentByTag(MTAG)。

      如果(mFragment =空&安培;!&安培;!mFragment.isDetached()){
          FFT = mActivity.getSupportFragmentManager()的BeginTransaction()。
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager()executePendingTransactions()。
      }
  }
 

}

I'm building an app with MainActivity which extends FragmentActivity and has an ActionBar with three tabs. At each tab I would like to attach a ParentFragment which should control the swipe among internal pages. The result should be that pressing the tabs the user should change from the different instances of the ParentFragment and swiping he should change among the TextViewFragments inside each ParentFragment.
Now I can perfectly switch among the three tabs, but the problem is that the ParentFragment is not correctly shown, it seems it's not even created because I can't even see the onCreate(), onCreateView() and onViewCreated() functions in the LogCat view.
I think that the problem resides in the custom TabListener class and its functions but I can't really understand what the problem is. I tried to search on many sites and I've looked into a lot of examples but none of them was related to the same situation.
What do I miss or what am I doing wrong here?

This is my MainActivity:

    import java.util.Random;
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.ViewPager;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.Toast;
    import com.viewpagerindicator.PageIndicator;

public class MainActivity extends FragmentActivity {

    MyAdapter mAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;    
    private View mCustomView; 
    private static final Random RANDOM = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set up the action bar.
        ActionBar.LayoutParams params = new ActionBar.LayoutParams(
                ActionBar.LayoutParams.MATCH_PARENT,
                ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER);
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);


            actionBar.addTab(actionBar
                    .newTab()
                    .setIcon(getIcon(0, true))
                    .setTabListener(
                            new TabListener<ParentFragment>(this, "home",
                                    ParentFragment.class)));

            actionBar.addTab(actionBar
                    .newTab()
                    .setIcon(getIcon(1, false))
                    .setTabListener(
                            new TabListener<ParentFragment>(this, "apps",
                                    ParentFragment.class)));

            actionBar.addTab(actionBar
                    .newTab()
                    .setIcon(getIcon(2, false))
                    .setTabListener(
                            new TabListener<ParentFragment>(this, "settings",
                                    ParentFragment.class)));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

    }


    public static class TabListener<T extends Fragment> implements
            ActionBar.TabListener {

        private Fragment mFragment;
        private final FragmentActivity mActivity;
        private final String mTag;
        private final Class<T> mClass;
        private final Bundle mArgs;
        private FragmentTransaction fft;
            public static final String TAG = TabListener.class.getSimpleName();

        public TabListener(FragmentActivity activity, String tag, Class<T> clz) {

            this(activity, tag, clz, null);
        }

        public TabListener(FragmentActivity activity, String tag, Class<T> clz,
                Bundle args) {

            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;

            mFragment = mActivity.getSupportFragmentManager()
                    .findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {

                fft = mActivity.getSupportFragmentManager().beginTransaction();
                fft.detach(mFragment);
                fft.commit();
            }
        }

        public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

            System.out.println(TAG + (" - ") + " -> mTag "
                    + mTag + " selected!");
            fft = mActivity.getSupportFragmentManager().beginTransaction();

            if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName());

                fft.add(android.R.id.content, mFragment, mTag);

            } else {
                System.out.println(TAG + (" - ") + " -> Fragment con mTag = " + mTag
                        + " trovato con tag!");
                fft.attach(mFragment);
                fft.commit();
            }
        }

        @Override
        public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {

        }

        @Override
        public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

            mFragment = mActivity.getSupportFragmentManager()
                    .findFragmentByTag(mTag);
            System.out.println(TAG + (" - ") + " -> mTag "
                    + mTag + " unselected!");

            if (mFragment != null && !mFragment.isDetached()) {
                fft = mActivity.getSupportFragmentManager().beginTransaction();
                fft.detach(mFragment);
                fft.commit();
            }
        }

    }

    public Drawable getIcon(int tabPosition, boolean selected) {

        switch (tabPosition) {
        case 0:
            return getResources().getDrawable(R.drawable.actionbar_home);

        case 1:
            return getResources().getDrawable(R.drawable.actionbar_apps);

        case 2:
            return getResources().getDrawable(R.drawable.actionbar_settings);

        }
        return null;
    }

}

And this is my ParentFragment which exteds now the android.support.v4.app.Fragment class:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.viewpagerindicator.IconPageIndicator;
import com.viewpagerindicator.PageIndicator;

public class ParentFragment extends Fragment {

    public static final String TAG = ParentFragment.class.getSimpleName();

    MyAdapter fragmentAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;



    public static ParentFragment newInstance() {
 System.out.println(TAG + " - newInstance()");
    System.out.println(TAG + " - " + methodName());
        ParentFragment fragment = new ParentFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
System.out.println(TAG + " - onCreate()");
        System.out.println(TAG + " - " + methodName());

        super.onCreate(savedInstanceState);
        setRetainInstance(true);

    }

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

System.out.println(TAG + " - onCreateView()");
        System.out.println(TAG + " - " + methodName());
        fragmentAdapter = new MyAdapter(getFragmentManager());

        View view = inflater.inflate(R.layout.simple_icons, container, false);
        mPager = (ViewPager) view.findViewById(R.id.pager);
        mPager.setAdapter(fragmentAdapter);

        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        System.out.println(TAG + " - onViewCreated()" );
        System.out.println(TAG + " - " + methodName());
        super.onViewCreated(view, savedInstanceState);

        mIndicator = (IconPageIndicator) getActivity().findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);          
    }
}

This is the MyAdapter class:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import com.viewpagerindicator.IconPagerAdapter;

public class MyAdapter extends PagerAdapter  {

    FragmentManager myFragmentMgr;
    private FragmentTransaction mCurTransaction;

    protected static final String[] CONTENT = new String[] { "This", "Is", "A", "Test", };
    protected static final int[] ICONS = new int[] {
            R.drawable.icon_page_indicator,
            R.drawable.icon_page_indicator,
            R.drawable.icon_page_indicator,
            R.drawable.perm_group_calendar,
            R.drawable.perm_group_camera,
            R.drawable.perm_group_device_alarms,
            R.drawable.perm_group_location
    };

    private int mCount = CONTENT.length;

    public MyAdapter(FragmentManager fm) {
        super();
        myFragmentMgr = fm;
    }

    @Override
    public int getCount() {

        return 3;
    }

    @Override
    public Object instantiateItem(ViewGroup viewGroup, int position) {

        ParentFragment fragment = ParentFragment.newInstance(); 
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup viewGroup, int position, Object obj) {

        if (mCurTransaction == null) {
            mCurTransaction = myFragmentMgr.beginTransaction();
        }
        mCurTransaction.detach((Fragment)obj);
    }   

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return false;
    }

    public Fragment getItem(int position) {
        Bundle args = new Bundle();
        args.putInt(TextViewFragment.POSITION_KEY, position);
        return TextViewFragment.newInstance(args);
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return "Fragment # " + position;
    }

    public int getIconResId(int index) {

        return ICONS[index % ICONS.length];
    }

     public void setCount(int count) {
            if (count > 0 && count <= 10) {
                mCount = count;
                notifyDataSetChanged();
            }
        } 
}

and the last the TextViewFragment class:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class TextViewFragment extends Fragment {

    public static final String POSITION_KEY = "POSITION";
    public static final String TITLE_KEY = "TITLE";

    public static TextViewFragment newInstance(Bundle args) {
        TextViewFragment fragment = new TextViewFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        TextView textview = (TextView) view.findViewById(R.id.textViewPosition);
        final int position;
        if (getArguments() != null) {
            position = getArguments().getInt(POSITION_KEY);
            textview.setText(Integer.toString(position));
        } else {
            position = 0;
            textview.setText("Child Fragment");
        }

        textview.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Toast.makeText(v.getContext(), "Clicked Position: " + position,
                        Toast.LENGTH_LONG).show();
            }
        });
    }    
}

----- EDIT: SOLUTION -----

I cannot answer my own question due to "low reputation" but I share anyway the solution, in order to help someone else and hopefully to recover some votes.

I finally found the way to make things work for me, I hope this could be helpful for anyone else experiencing the same problem. As I suspected, the problem was in TabListener. My problem was solved changing that part with this code:

   public static class TabListener<T extends Fragment> implements
            ActionBar.TabListener {
    private Fragment mFragment;
    private final FragmentActivity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private FragmentTransaction fft;

    public TabListener(FragmentActivity activity, String tag, Class<T> clz) {

        this(activity, tag, clz, null);
    }

    public TabListener(FragmentActivity activity, String tag, Class<T> clz,
            Bundle args) {

        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        System.out.println(TAG + " - " + methodName() + " - Constructor of TabListener -> mTag = "
                + mTag);
        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state. If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {

            fft = mActivity.getSupportFragmentManager().beginTransaction();
            fft.detach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }

    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

        Fragment tmp = mActivity.getSupportFragmentManager()
                .findFragmentByTag(mTag);

        fft = mActivity.getSupportFragmentManager().beginTransaction();

        if (mFragment == null) {

            System.out.println(TAG + " - " + methodName() + " - add mFragment " + mTag);
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            fft.add(android.R.id.content, mFragment, mTag);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        } else {
            System.out.println(TAG + " - " + methodName() + " - attach mFragment " + mTag);
            // If it exists, simply attach it in order to show it
            fft.attach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
        System.out.println(TAG + " - " + methodName() + " - mFragment " + mTag);

    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

        mFragment = mActivity.getSupportFragmentManager()
                .findFragmentByTag(mTag);

        if (mFragment != null && !mFragment.isDetached()) {
            System.out.println(TAG + " - " + methodName() + " - detach mFragment " + mTag);
            fft = mActivity.getSupportFragmentManager().beginTransaction();
            fft.detach(mFragment);
            fft.commit();
            mActivity.getSupportFragmentManager()
                    .executePendingTransactions();
        }
    }



    public static final String TAG = TabListener.class.getSimpleName();
    private static final int CLIENT_CODE_STACK_INDEX;

    static {
        // Finds out the index of "this code" in the returned stack trace -
        // funny but it differs in JDK 1.5 and 1.6
        int i = 0;
        for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            i++;
            if (ste.getClassName().equals(TabListener.class.getName())) {
                break;
            }
        }
        CLIENT_CODE_STACK_INDEX = i;
    }

    public static String methodName() {

        if (Thread.currentThread().getStackTrace().length < CLIENT_CODE_STACK_INDEX)
            return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX]
                    .getMethodName() + "()";
        else
            return new String(
                    "methodName() - stackTrace index is out of bound");
    }
}

The fundamental difference was the addition after each commit() of the following line:

mActivity.getSupportFragmentManager().executePendingTransactions();

This problem was really poorly documented and probably happens only in particular conditions, but I hope this solution saves some time to anyone else having the same issues!

解决方案

Thanks for the answer, I had this exact same problem with the support library where the fragments will be overlaid ontop of each other when i tried to switch between tabs. There were a couple of unused variables in the solution so I cleaned it up a bit:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {

  private Fragment mFragment;
  private final FragmentActivity mActivity;
  private final String mTag;
  private final Class<T> mClass;
  private FragmentTransaction fft;

  public TabListener(FragmentActivity activity, String tag, Class<T> clz) {

      mActivity = activity;
      mTag = tag;
      mClass = clz;

      // Check to see if we already have a fragment for this tab, probably
      // from a previously saved state. If so, deactivate it, because our
      // initial state is that a tab isn't shown.
      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
      if (mFragment != null && !mFragment.isDetached()) {

          fft = mActivity.getSupportFragmentManager().beginTransaction();
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager()
          .executePendingTransactions();
      }
  }

  @Override
  public void onTabSelected(Tab tab, FragmentTransaction ft) {

      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
      fft = mActivity.getSupportFragmentManager().beginTransaction();

      if (mFragment == null) {

          // If not, instantiate and add it to the activity
          mFragment = Fragment.instantiate(mActivity, mClass.getName());
          ft.add(R.id.content_view, mFragment, mTag);
          //fft.add(android.R.id.content, mFragment, mTag);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      } else {

          // If it exists, simply attach it in order to show it
          fft.attach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      }
  }

  @Override
  public void onTabReselected(Tab tab, FragmentTransaction ft) {

  }

  @Override
  public void onTabUnselected(Tab tab, FragmentTransaction ft) {

      mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

      if (mFragment != null && !mFragment.isDetached()) {
          fft = mActivity.getSupportFragmentManager().beginTransaction();
          fft.detach(mFragment);
          fft.commit();
          mActivity.getSupportFragmentManager().executePendingTransactions();
      }
  }

}

这篇关于安卓:动作条,TabListener和support.v4.Fragment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆