我在viewPager中有几个页面(片段).
当我试图删除(例如)第一个时,像这样:
mFragmentManager.beginTransaction().remove(Page1).commit();
Run Code Online (Sandbox Code Playgroud)
它说
IllegalStateException has occured.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么.有人能帮助我吗?谢谢.
例外:
java.lang.IllegalStateException: Can't change tag of fragment Page2{40586418 #2 id=0x7f080006 android:switcher:2131230726:2}: was android:switcher:2131230726:2 now android:switcher:2131230726:1
Run Code Online (Sandbox Code Playgroud) 我尝试让我的 FragmentPagerAdapter 正常工作,但这些示例对于现实生活来说有点简单:
@Override
public Object instantiateItem(final ViewGroup container, final int position)
{
final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int resId = 0;
switch (position)
{
case 0:
resId = R.layout.favorites_fragment;
break;
case 1:
resId = R.layout.nearby_list_fragment;
break;
default:
throw new IllegalArgumentException("Index cant be mapped to fragement:" + position);
}
final View view = inflater.inflate(resId, null);
viewPager.addView(view, 0);
return view;
}
Run Code Online (Sandbox Code Playgroud)
因为我想使用片段,所以我已经对这个方法感到困惑了,作为所有示例,我可以找到充气视图而不是在那里创建片段。这个怎么做 ?
PS:我使用 ActionBarSherlock lib 4.1...
谢谢,延斯
在FragmentParentNewsDetail.java类中,我有一个ViewPager,然后我使用FragmentPagerAdapter将每个页面设置为相同的Fragment,如下所示:
@Override
public Fragment getItem(int position)
{
String newsId = this.myNewsIds.get(position);
Bundle bundle = new Bundle();
bundle.putInt(FragmentNewsDetail.NEWS_ID, Integer.parseInt(newsId));
FragmentNewsDetail fragmentNewsDetail = new FragmentNewsDetail();
fragmentNewsDetail.setArguments(bundle);
return fragmentNewsDetail;
}
Run Code Online (Sandbox Code Playgroud)
在FragmentNewsDetail.java中,我有一个公共方法:
public String getNewsTitle()
{
Log.d(TAG, "getNewsTitle:" + newsTitle);
return newsTitle;
}
Run Code Online (Sandbox Code Playgroud)
然后我想在FragmentNewsDetail.java中调用getNewsTitle()方法,如下所示:
newsTitle = ((FragmentNewsDetail)myAdapter.getItem(vpViewPager.getCurrentItem())).getNewsTitle();
Run Code Online (Sandbox Code Playgroud)
但getNewsTitle()总是返回"",我对此感到困惑.
通过以下方法修复:
public Fragment getCurrentFragment(ViewPager pager,
FragmentPagerAdapter adapter)
{
try
{
Method m = adapter
.getClass()
.getSuperclass()
.getDeclaredMethod("makeFragmentName", int.class,
long.class);
Field f = adapter.getClass().getSuperclass()
.getDeclaredField("mFragmentManager");
f.setAccessible(true);
FragmentManager fm = (FragmentManager) f.get(adapter);
m.setAccessible(true);
String tag = null;
tag …Run Code Online (Sandbox Code Playgroud) 我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个Fragment.我想在用户从右向左滑动时动态地向适配器添加一个新的Fragment,并在用户从左向右滑动时动态删除Fragment.我试图使用这个库https://github.com/commonsguy/cwac -pager但是在该库中我们可以选择在按钮点击上添加和删除片段.我试图将一个OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致向FragmentPagerAdapter添加了多个片段.所以请详细说明如何做到这一点.
android android-viewpager fragmentpageradapter commonsware-cwac
我已经使用Eclipse默认的ViewPager应用程序参数创建了应用程序.主要活动包含2个选项卡(tabA和tabB).每个标签指的是其片段(fragmentA和fragmentB).
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
// Top Rated fragment activity
return new Cars();
case 1:
// Games fragment activity
return new News();
}
return null;
}
@Override
public int getCount() {
// Show 2 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
} …Run Code Online (Sandbox Code Playgroud) android android-fragments fragmentpageradapter android-tabs android-listfragment
我遇到了一种奇怪的(也许这是正常的...)行为。我有一个带有viewpager的活动,里面有 3 个片段。我正在使用 FragmentPagerAdapter 和 setOffScreenPageLimit = 3。当我在应用程序第一次打开时将 apk 部署到我的设备 (N4)时,在 onResume 之后,onPause 方法被调用。这给我带来了一些问题,因为我覆盖了片段内的 onPause 并且我有一些特定的行为。部署后,即使我完全杀死应用程序并重新打开它,也不会再发生这种情况。这有什么意义?提前谢谢了。
android android-lifecycle android-fragments android-viewpager fragmentpageradapter
好的,我会尝试尽可能清楚.我有一个名为CheckerManager的片段,它包含一个ViewPager.此ViewPager将允许用户在3个片段之间滑动,所有片段都是另一个名为CheckerFragment的片段的实例.我正在使用FragmentPagerAdapter来处理分页.这是它的外观
private class PagerAdapter extends FragmentPagerAdapter {
CharSequence mTabTitles[];
public PagerAdapter(FragmentManager fm, CharSequence tabTitles[]) {
super(fm);
mTabTitles = tabTitles;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_LOTTO);
case 1:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_DAILY);
case 2:
return CheckerFragment.newInstance(MainFragment.DRAW_TITLE_EURO);
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return mTabTitles[position];
}
@Override
public int getCount() {
return 3;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道ViewPager将始终在当前片段的任一侧创建片段.所以说我的3个CheckerFragments被称为A,B和C,当前的片段是A.已经创建了B. 但我的问题是,即使我仍然在看片段A,片段B是'活跃的'片段.我创建的每个输入实际上都对应于片段B而不是A.活动片段始终是ViewPager最后创建的片段.
我看了很多东西,看看是否有人有同样的问题,但我发现很难描述什么是错的.我认为这与所有ViewPagers片段属于同一类型的事实有关 - 即CheckerFragment.我在应用程序的其他地方的片段内部有一个ViewPager的工作实现,我唯一的区别是每个页面都是不同类型的片段.
任何帮助,将不胜感激!
*编辑
PagerAdapter adapter = new PagerAdapter(getChildFragmentManager(), tabTitles);
ViewPager viewPager = (ViewPager)view.findViewById(R.id.viewPagerChecker); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter android-nested-fragment
在我的应用程序中,我使用ViewPager和FragmentStatePagerAdapter来显示4种不同的布局.布局1,3,4由ListView组成,第二布局包含SurfaceView Camera.现在,当我在水平滚动相机时,两个边缘都会闪烁.
我搜索谷歌,并找到不同的解决方案.比如1)给android减去边距:layout_gravity ="center".2)viewPager.requestTransparentRegion(viewPager);
在第一种情况下,它在第一次工作时很好,但是当从简历返回时,它从右边切割显示黑色矩形.
我也尝试过不同的父布局,但同样的情况发生了,并试图以编程方式给出边距,但找不到任何解决方案.
这是我的Camera xml.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_marginRight="-100dp"
android:layout_marginLeft="-100dp"
android:layout_height="match_parent"
android:visibility="visible" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的片段适配器.
public class DashboardAdapter extends FragmentStatePagerAdapter {
public DashboardAdapter(FragmentManager fm) {
super(fm);
fragmentList = new ArrayList<>();
fragmentList.add(new InboxFragment());
fragmentList.add(new CameraFragment());
fragmentList.add(new ContactFragment());
fragmentList.add(new AddFriendsFragmnet());
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return InboxFragment.newInstance(position);
case 1:
return CameraFragment.newInstance(position);
case 2:
return ContactFragment.newInstance(position);
case 3:
return AddFriendsFragmnet.newInstance(position);
default:
return CameraFragment.newInstance(position);
}
}
@Override
public int getCount() …Run Code Online (Sandbox Code Playgroud) android-layout android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter
我正在尝试使用MVP设置标签式布局并遇到一些困难.我正在使用Google的Dagger MVP示例应用作为一般参考,并且它们将引用存储在每个活动中的每个演示者中.但是,在我的选项卡式布局中,我正在使用一个活动,每个选项卡都有一个片段(通过FragmentPagerAdapter传递).片段被实例化,并且他们的演示者在FragmentPagerAdapter的getItem()方法中注入.问题是,当应用程序旋转时,我的片段会自动重建,但不会让他们的演示者返回,然后由于NPE而崩溃.我一直将演示者存储为活动或FragmentPagerAdapter(谷歌)中的字段,但无论如何都不能正常工作.
这基本上就是我现在在FragmentPagerAdapter中的做法:
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
@Inject MyPresenter mMyPresenter;
@Override
public Fragment getItem (int position){
switch (position) {
case MY_FRAGMENT_INDEX:
return createMyFragment;
case OTHER_FRAGMENT_INDEX:
return createMyOtherFragment;
default:
return null;
}
private Fragment createMyFragment() {
MyFragment myFragment = MyFragment.newInstance();
// make the presenter
DaggerMyPresenterComponent.builder()
.MyModelComponent(
((MyApplication) getApplication()).getMyModelComponent())
.MyPresenterModule(new MyPresenterModule(myFragment)).build()
.inject(this);
return myFragment;
}
Run Code Online (Sandbox Code Playgroud)
处理这种情况的好架构是什么?我应该在哪里保留对演示者的引用(如果有的话),以及如何管理他们的实例化和重新创建(如果FragmentPagerAdapter不会为我做这些)?
我有将数据传递给片段的问题.它在生产中的所有时间都有0.1%的崩溃.让我们说100k开放活动它发生了100次.它看起来并不常见,但它非常困扰我,我认为我在使用数据进行片段初始化时出错了.问题是,我只创建了一次片段,而其他所有时间我都需要将数据传递给它们我正在做下一步:myFragmentInstance.setData(Object someData);发生崩溃是因为它告诉片段中的那些视图元素未找到并且它们是NULL,但如果我没有重新创建它们,一切都应该没问题.我没有旋转手机,也没有足够的内存.它发生在网络重新连接上,因为在网络重新连接时,我将服务器获取新数据,然后将新数据设置为我的片段.我有我使用的两个片段的字段照片,maby你们中的一些人知道这些数据可以告诉崩溃时片段的状态.我正在使用库ButterKnife初始化片段和活动的字段,而不是初始化它findById,maby它有一些影响或没有?
这里是简单项目的链接(在github上只有这个问题): https ://github.com/yozhik/Reviews/tree/master/app/src/main/java/com/ylet/sr/review
描述:
CollapsingActivity- 活动Collapsing AppBarLayout.它将一个或两个片段加载到" fragment_content_holder"中,并且必须TabLayout在视图寻呼机中的片段之间切换.
在活动方法onCreate()- 我只是模拟对server(loadData)的请求,并且当加载一些假数据时 - 我在第一次调用时在视图寻呼机中显示片段 - 我正在创建新的TabMenuAdapter扩展FragmentPagerAdapter,用片段填充它并保存到实例的链接.在下一个调用中 - 我不会从头开始创建片段,只是用新数据填充它们.
MenuFragment1, MenuFragment1 - 两个片段.MenuFragment1- 有方法public void setupData(SomeCustomData data),设置新数据,不在网络重新连接上重新创建片段.
NetworkStateReceiver - 收听网络更改并发送通知.
TabMenuAdapter - 只是简单的类来保存片段.
05-11 18:11:05.088 12279-12279/com.myProjectName E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myProjectName, PID: 12279
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95) …Run Code Online (Sandbox Code Playgroud) android android-fragments fragmentpageradapter butterknife android-tablayout