当前位置: 首页 > 知识库问答 >
问题:

片段上的ActionBar Sherlock ViewPager

孙海
2023-03-14

当我向上选择选项卡时,它起作用,但当我返回时,内容变成白色。LogCat显示:

致命异常:main java.lang.IllegalArgumentException:在Android.support.v4.app.FragmentManagerImpl.MoveToState(FragmentManager.java:903)在Android.support.v4.app.FragmentManagerImpl.MoveToState(FragmentManager.java:1088)在Android.support.v4.app.FragmentManagerImpl.MoveToState)在Android.support.v4.app.FragmentManager.ExecpendingActions(FragmentManager)中找不到id476)在com...viewpager.TabsAdapter.onTabSelect(TabsAdapter.java:76)在com.actionbarsherlock.internal.app.actionbarimpl.selectTab(actionbarimpl.java:526)在com.actionbarsherlock.internal.app.actionbarimpll$Tabimpl.select(actionbarimpl.java:907)在com.actionbarsherlock.internal.widget.scrollingtabcontainerview$TabClickListener.onClick(

我的班级:

public class TabsAdapter extends FragmentPagerAdapter implements
        ActionBar.TabListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    ProgressDialog dialog;

    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = activity.getSupportActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

    public int getCount() {
        return mTabs.size();
    }

    public SherlockFragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return (SherlockFragment) Fragment.instantiate(mContext,
                info.clss.getName(), info.args);
    }

    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
    }

    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    public void onPageScrollStateChanged(int state) {
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
        Object tag = tab.getTag();
        for (int i = 0; i < mTabs.size(); i++) {
            if (mTabs.get(i) == tag) {
                mViewPager.setCurrentItem(i);
            }
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

}

更新:

保存ViewPager的方法:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConnectionChangeReceiver cm = new ConnectionChangeReceiver();
        cm.onReceive(this, getIntent());

        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.viewpager);
        setContentView(mViewPager);

        RssReaderTask.setRssUrl(this,
                "http://url?type=rss");
        SchedulerManager.getInstance().saveTask(this, "0 9-20 * * 1,2,3,4,5",
                RssReaderTask.class);
        SchedulerManager.getInstance().restart(this, RssReaderTask.class);


        NotifyClass.getInstance().setSlideCreate(true);

        if (!isOnline()) {
            showDialog(DIALOG_ERROR_CONNECTION);
            Log.d("TAG", "TRUE");
        }

        if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) {
            // do nothing
        } else {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        globalvar = new GlobalVariable();
        globalvar.set_radio_encours_global(false);
        globalvar.setOnHold_global(false);

        mTabsAdapter = new TabsAdapter(this, mViewPager);

        bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setDisplayShowTitleEnabled(false);
        bar.setDisplayShowHomeEnabled(false);

        mTabsAdapter.addTab(bar.newTab().setText("Tab1"),
                Tab1.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("Tab2"), Tab2.class,
                null);
        mTabsAdapter.addTab(bar.newTab().setText("Tab3 "),
                Tab3.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("Tab4"),
                Tab4.class, null);

    }

共有1个答案

余天宇
2023-03-14

你的课没问题,它应该能用,我用的也一样,它能用...我认为保存viewpager的Activity/Fragment中存在问题,所以我建议检查onCreate/onCreateView方法。
如果找不到任何东西,请发布此方法的代码,如果命名方法不是导致错误的原因,则发布类的代码。

 类似资料:
  • 我有一个TabLayout或TabHost的设计,无论你想考虑什么。假设这是选项卡- Tab1 | Tab2 | Tab3 | Tab4 | Tab5 在此情况下,将执行以下操作- 表1-打开碎片1 表2-打开碎片2 Tab3-在现有片段上打开一个覆盖图,显示半透明的黑色视图 表4-打开碎片3 表5-打开碎片4 你知道怎么解决这个问题吗?提前感谢!! 更新:我使用的解决方案 我试过这个,但不得不进

  • 我正在使用jetpack导航从片段过渡到细节片段。 我需要帮助在显示细节片段的片段上显示细节片段。 请看下面的照片,看看我正在努力实现什么: 我也在导航图中的动画上使用基本的fade_in/fade_out。 这是我得到的结果: 如何设置转换以使细节片段显示在呈现视图上? 这是我所有的进步: 底部导航菜单 导航图 主要活动。kt Tab1片段(这是带有埃菲尔铁塔图像的片段 赏金编辑: 我希望在导航

  • 我开发了一个应用程序,其中有导航抽屉和抽屉内的许多片段,所以我在打开片段内的片段时遇到问题,在一个片段中,当用户单击列表视图项时,我有列表视图,他们获得了与列表项相关的数据,所以我面临的问题是,它仍然单击不可见的列表,但单击 片段布局 开放片段代码

  • 设置文本指针异常,我得到错误。 } 我得到的错误; E/AndroidRuntime:致命异常:主进程:com.vortex.soruhafizam,PID:6341 java.lang.nullPointerException:尝试对位于com.vortex.soruhafizam.fragmentbirinci.onCreateView(Fragmentbirinci.java:32)的And

  • 我的中有10个选项卡。打开活动后,第一个片段就会显示出来,但下一个片段中的方法(AsyncTask)会被调用。如果我转到下一个选项卡,比如第3个选项卡,那么将调用第4个中的方法,依此类推。 我不理解这种行为。请救命!

  • 有人有教程来实现使用支持库v7(appcomat_v7)的片段中的CAB吗? 我不知道该怎么做,我找不到一个教程来解释一个片段中的实现和使用支持库。 谢谢你的阅读。