标签: fragmentpageradapter

Android获取FragmentPagerAdapter中的片段

我有以下问题:我有一个活动,其中我有两个选项卡,使用FragmentPagerAdapter作为片段 在某些时刻我想更改其中一个片段的视图,但我无法找到FragmentById()findFragmentByTag( )我无法设置id,因为我没有在XML中声明Fragment,因为FragmentPagerAdapter 当我尝试设置标记时,我遇到了以下问题:

08-15 21:46:23.805: E/AndroidRuntime(9297): java.lang.IllegalStateException: Can't  change tag of fragment Companies{416d7b78 id=0x7f04002e companies}: was companies now android:switcher:2130968622:1
Run Code Online (Sandbox Code Playgroud)

我的寻呼机FragmentPagerAdapter的代码:

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


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

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmentpageradapter

34
推荐指数
3
解决办法
4万
查看次数

FragmentPagerAdapter notifyDataSetChanged不起作用

我有一个FragmentPagerAdapter.它的getItem方法可以根据它从外部获得的数据返回一个片段.在我更新数据后,它假设显示我打电话notifyDataSetChanged但没有任何反应.我DID覆盖getItemPosition返回的方法POSITION_NONE:

public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
        ViewPager.OnPageChangeListener
{
    private final Context mContext;
    private final TabHost mTabHost;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private PagerTabsFragments fragmentDisplayInfo = null; // for now only a
                                                            // single size
                                                            // back
                                                            // stack

    static class PagerTabsFragments
    {
        public int tabPosition;
        public Fragment fragmentToDisplay;
        public Object fragmentInfo;

        public PagerTabsFragments(int tab, Fragment frag, Object info)
        {
            tabPosition = tab;
            fragmentToDisplay …
Run Code Online (Sandbox Code Playgroud)

android android-adapter fragmentpageradapter notifydatasetchanged

34
推荐指数
3
解决办法
2万
查看次数

用Fragment替换ViewPager - 然后导航回来

我有一个活动,最初主持一个ViewPager,连接到FragmentPagerAdapter.

当用户点击ViewPager的子片段中的项目时,我正在使用FragmentTransaction将空容器视图替换为我想要导航到的新片段.

如果我在事务上使用addToBackStack(),提交事务然后导航回来,我不会返回到ViewPager的视图(初始布局).

如果我不在事务上使用addToBackStack(),提交事务然后导航回来,应用程序退出.

很明显ViewPager没有被添加到backstack中(这并不令人惊讶,因为它本身不是一个片段).但是我希望默认行为是背压将我带回到那个活动的初始阶段.查看(ViewPager).

基于我所读到的内容,似乎可能是因为片段事务正在发生,ViewPager或PagerAdapter会丢失应该显示哪个片段的跟踪.

我真的对此感到困惑,但我最终创建了一大堆代码覆盖了onBackPress并显示和隐藏了viewpager视图.我认为有一种更简单的方法可以使用默认行为来执行适当的导航.

TL;博士

A是一个托管片段的Viewpager.B是一个新片段.

当我用B替换A,然后按回来时,我希望导航回A,但这不会发生.

任何建议将不胜感激.

码:

主要活动:

  @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

        headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
        headingLayout.setVisibility(View.GONE);

        // Set up the ViewPager, attaching the adapter and setting up a listener
        // for when the
        // user swipes between sections.
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mViewPager.setPageMargin(8);

        /** Getting fragment manager */
        FragmentManager fm = getSupportFragmentManager();

        /** Instantiating FragmentPagerAdapter */
        MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the pagerAdapter to the pager object */ …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager fragmentpageradapter

30
推荐指数
3
解决办法
2万
查看次数

使用getItemPosition(Object object)重新排序FragmentStatePagerAdapter中的页面

我相信当重写getItemPosition(Object object)以重新排序页面时,FragmentStatePagerAdapter的行为不正确.

下面是一个简单的例子.在初始状态中,页面的顺序是{A,B,C}.在呼叫时toggleState(),页面的顺序变为{A,C,B}.通过覆盖getItemPosition(Object object),我们确保正在查看的当前页面(A,B或C)不会更改.

public static class TestPagerAdapter extends FragmentStatePagerAdapter {
    private boolean mState = true;

    public TestPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

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

    private void toggleState() {
        mState = !mState;
        notifyDataSetChanged();
    }

    private String getLabel(int position) {
        switch (position) {
            case 0:
                return "A";
            case 1:
                return mState ? "B" : "C";
            default:
                return mState ? "C" : "B";
        }
    }

    @Override
    public int getItemPosition(Object object) { …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager fragmentpageradapter

24
推荐指数
1
解决办法
2万
查看次数

Android FragmentStatePagerAdapter

我正在使用这个例子使用FragmentStatePagerAdapter .

MyAdapter类实现如下:

public static class MyAdapter extends FragmentStatePagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

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

        @Override
        public Fragment getItem(int position) {
            return ArrayListFragment.newInstance(position);
        }
    }
Run Code Online (Sandbox Code Playgroud)

ListFragment类包含以下创建新实例的方法:

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    static ArrayListFragment newInstance(int num) {
        ArrayListFragment f = new ArrayListFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmentpageradapter

21
推荐指数
3
解决办法
4万
查看次数

FragmentPagerAdapter滑动以显示ListView 1/3屏幕宽度

编辑: 请参阅下面的答案 - >

我想要一个视图,当向右滑动时,会显示listView.与新版Google Play商店中实施的内容非常相似(下面的示例图片).我认为它是一个ViewPager,但我尝试重复它没有占上风.我认为可能只是'listView Page'width属性设置为特定的dp,但这不起作用.我也尝试修改pakerfeldt的viewFlow并且无法弄清谷歌是如何做到这一点的

我是在正确的轨道上吗?如果有人知道如何复制这个,我将非常感激.我认为这可能成为在平板电脑上显示导航视图的一种流行的新方式....?代码将是最好的帮助.谢谢!!

在此输入图像描述

向右滑动:

在此输入图像描述

刷完了; 布局显示列表和第二部分(完全如图所示)列表片段未填满屏幕:

在此输入图像描述

当用户向左滑动时,仅显示主页面,如果用户再次向左滑动,则viewPager继续到下一页面.

android android-listview android-viewpager fragmentpageradapter google-play

20
推荐指数
2
解决办法
2万
查看次数

尝试在空对象引用上调用虚方法'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'

我的应用程序由4个片段组成,作为使用的父片段加载的选项卡FragmentPagerAdapter.

问题是,当我运行应用程序并按下并重新打开应用程序时,我收到此错误日志:

FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
    at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513)
    ...
Run Code Online (Sandbox Code Playgroud)

父片段内的代码行是:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
Run Code Online (Sandbox Code Playgroud)

ViewPageAdapter两个不为空!

我必须提到我Fragment的所有生命周期都在管理中,并且在适配器内部发生了null问题!并且当我使用Activityas而不是Fragment!!! 时,同样的适配器工作正常!

android nullpointerexception android-fragments fragmentpageradapter android-support-library

20
推荐指数
3
解决办法
1万
查看次数

如何使用FragmentPagerAdapter获取包含不同内容的标签?

我希望有不同的标签,你可以在Android市场中轻扫.每个选项卡应使用一个片段并使用一种方法.

这是我的FragmentPagerAdapter类:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        Fragment fragment =null;
        switch (position) {
            case 0:
                fragment = new ConnectionFragment();
                break;
            case 1:
                fragment = new DataFragment();
                break;              
            case 2:
                fragment = new GraphFragment();
                break;          }
        return fragment;    
    }
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

每个片段类型/选项卡都有三个类:

public static class ConnectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number"; …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments fragmentpageradapter

19
推荐指数
2
解决办法
6万
查看次数

FragmentPagerAdapter - 如何处理方向更改?

我使用FragmentPagerAdapter包含几个片段,需要通知有关更改database.我通过迭代片段来实现这一点,片段实现了一个回调接口,并调用了一个refreshData()方法.

这可以正常工作,直到设备改变方向.在方向更改后,即使方法调用似乎有效,片段UI也不会明显刷新.

从我到目前为止所读到的,这是因为FragmentPagerAdapter片段生命周期的句柄和接收回调的片段不是实际显示的片段.

private class DataPagerAdapter extends FragmentPagerAdapter {

    private DataFragment[] fragments = new DataFragment[] {
                                     new FooDataFragment(), BarDataFragment()};

    public DataPagerAdapter(android.support.v4.app.FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

    @Override
    public int getCount() {
        return fragments.length;
    }

    public DataFragment[] getFragments() {
        return fragments;
    }
}

protected void refreshData() {
    for (DataFragment dataFragment : mPagerAdapter.getFragments()) {
     dataFragment.refreshData();
}
Run Code Online (Sandbox Code Playgroud)

我在每个片段中使用广播接收器暂时解决了这个问题,但这个解决方案似乎很浪费,可能会造成内存泄漏.如何正确解决这个问题?我在横向模式下使用不同的布局和逻辑,因此我想在方向更改后使用新创建的片段.

android android-fragments fragmentpageradapter

19
推荐指数
1
解决办法
1万
查看次数

在恢复活动时刷新FragmentStatePagerAdapter上的图像

我创建了一个FragmentStatePagerAdapter用于提供小型图库的活动.但是,当活动恢复时(例如,从其他活动返回后),我无法刷新它.每次前两张图片都是空白的,只有在我将两张图片刷到一边后,它们才会刷新.我找到的答案都没有起作用(特别是压倒一切getItemPosition())

我这样设置:

mPagerAdapter = new PhotosPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.photosViewPager);
mPager.setAdapter(mPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

然后我有FragmentStatePagerAdapter类:

private class PhotosPagerAdapter extends FragmentStatePagerAdapter{

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

    @Override
    public int getCount() {
        return photos.size();   
    }

    @Override
    public Fragment getItem(int position) {
        ImageFragment f = new ImageFragment(position);
        return f;
    }

    @Override
    public int getItemPosition(Object object) {
        throw new RuntimeException();
        //return POSITION_NONE;
    }

}
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,我在getItemPosition中抛出RuntimeException,因为我想检查它何时被调用.直到我添加一些包含我的图片的列表才会调用它.然后是ImageFragment类:

public class ImageFragment extends Fragment{

    int position;
    Bitmap mBitmap;
    int width;
    int height;
    ImageView img;

    public ImageFragment(){ …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager fragmentpageradapter

18
推荐指数
1
解决办法
3万
查看次数