我有以下问题:我有一个活动,其中我有两个选项卡,使用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) 我有一个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
我有一个活动,最初主持一个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
我相信当重写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) 我正在使用这个例子使用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) 编辑: 请参阅下面的答案 - >
我想要一个视图,当向右滑动时,会显示listView.与新版Google Play商店中实施的内容非常相似(下面的示例图片).我认为它是一个ViewPager,但我尝试重复它没有占上风.我认为可能只是'listView Page'width属性设置为特定的dp,但这不起作用.我也尝试修改pakerfeldt的viewFlow并且无法弄清谷歌是如何做到这一点的
我是在正确的轨道上吗?如果有人知道如何复制这个,我将非常感激.我认为这可能成为在平板电脑上显示导航视图的一种流行的新方式....?代码将是最好的帮助.谢谢!!

向右滑动:

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

当用户向左滑动时,仅显示主页面,如果用户再次向左滑动,则viewPager继续到下一页面.
android android-listview android-viewpager fragmentpageradapter google-play
我的应用程序由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)
并ViewPage和Adapter两个不为空!
我必须提到我Fragment的所有生命周期都在管理中,并且在适配器内部发生了null问题!并且当我使用Activityas而不是Fragment!!! 时,同样的适配器工作正常!
android nullpointerexception android-fragments fragmentpageradapter android-support-library
我希望有不同的标签,你可以在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) 我使用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)
我在每个片段中使用广播接收器暂时解决了这个问题,但这个解决方案似乎很浪费,可能会造成内存泄漏.如何正确解决这个问题?我在横向模式下使用不同的布局和逻辑,因此我想在方向更改后使用新创建的片段.
我创建了一个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