我不熟悉FragmentPagerAdapter,所以这将成为我们(你)批判性地阅读描述的问题之一.
结构:我有一个FragmentPagerAdapter(下面的代码),一次可以容纳两个片段.第一个显示书籍摘录,第二个显示书名列表.
目标:我想实现标题中描述的内容:用户可以导航到寻呼机中的第二个片段,单击标题,然后我想将用户移回第一个片段并告诉第一个片段更新文本.第一个片段有一个triggerRefresh方法.
代码:我相信我的问题发生是因为FragmentPagerAdapter重用/创建片段的方式(我不明白).这是我的班级:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建相关成员的方式:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
Run Code Online (Sandbox Code Playgroud)
这就是我在我的活动中尝试过的其他内容,当我收到书名为Fragment并选择了标题的回调时:
mViewPager.setCurrentItem(0); …Run Code Online (Sandbox Code Playgroud) android updating android-fragments android-viewpager fragmentpageradapter
我在使用ViewPager和FragmentPagerAdapter处理屏幕方向更改时遇到问题.它在应用程序启动时工作正常,但在方向更改(可能丢失)后,viewpager中的片段不可见.我该如何解决这个问题.以下是我的活动结构:

编辑:这是清单文件
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<application
android:name="com.test.myapp.NetworkManager.TBVolleyInstance"
android:allowBackup="true"
android:icon="@drawable/launcher"
android:label="@string/app_name"
android:theme="@style/CustomActionBarTheme">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name=".Home"
android:label="@string/app_name"
android:windowSoftInputMode="adjustNothing" >
</activity>
<activity
android:name=".RouterActivity"
android:label="@string/app_name" >
<intent-filter android:label="@string/app_name" >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
FragmentPagerAdapter实现:
public class PagerAdapter extends FragmentPagerAdapter{
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new Fragment1();
case 1: …Run Code Online (Sandbox Code Playgroud) 在我MainActivity,我有:
@Override
protected void onResume() {
super.onResume();
checkForCrashes();
checkForTutorial();
checkForUpdates();
setStore();
setup();
}
Run Code Online (Sandbox Code Playgroud)
在setup(),我打电话initializeTabs()回调:
protected void setup() {
final Store s = getStore();
setBackground();
if (s == null) {
unauthorizedHandler();
return;
}
final Context mainActivity = this;
fragments = getTabFragments();
StoresController.getStoreDetails(s, mainActivity, new Callback<StoreDetailDecorator>() {
@Override
public void success(StoreDetailDecorator storeDetailDecorator, Response response) {
s.prettyName = storeDetailDecorator.store.pretty_name;
s.save();
Log.v(TAG, s.prettyName);
TextView toolbar_label = (TextView)findViewById(R.id.toolbar_label);
toolbar_label.setText(MainActivity.getTruncatedMenuName(s.name()));
SummaryTab t1 = (SummaryTab)fragments.get(0);
t1.notifier = (SummaryTabLoadingNotifier)mainActivity;
initializeTabs(s, fragments);
t1.populateReport(); …Run Code Online (Sandbox Code Playgroud) 我看了很多代码,无法解决这个问题.http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html
它必须是简单的东西.我正在展示大部分代码.错误在下一节中.
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {
public static final int TAB_COUNT = 3;
public static InputMethodManager inputManager;
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// When swiping between different sections, select the corresponding
// tab.
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
}); …Run Code Online (Sandbox Code Playgroud) android android-listview android-fragments fragmentpageradapter
我有FramentPageAdapter的奇怪问题
MainActivity.java
@SuppressLint("ValidFragment")
public class MainActivity<DashboardActivity> extends FragmentActivity implements ActionBar.TabListener {
...
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(0)).setTabListener(this).setIcon(R.drawable.rating_good));
actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(1)).setTabListener(this).setIcon(R.drawable.action_search));
actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(2)).setTabListener(this).setIcon(R.drawable.action_search));
}
...
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
public Fragment getItem(int position) {
Fragment fragment = null;
switch(position) {
case …Run Code Online (Sandbox Code Playgroud) 我有一个包含ViewPager的Activity,它显示N个片段.每个片段都在我的ViewPager的自定义适配器(extends FragmentStatePagerAdapter)中显示ArrayList中对象的属性.
该片段具有(除其他外)一个按钮,该按钮应该移除当前显示的片段并滚动到下一个片段,setCurrentItem(position, true)以便如果用户向后滚动,则前一个项目消失.我通过使用这样的东西(简化)这样做:
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyActivity parentActivity = (MyActivity)getActivity();
// First, scroll to next item (smoothly)
parentActivity.pager.setCurrentItem(parentActivity.pager.getCurrentItem()+1, true);
// Database stuff...
doSomeDBOperations();
// Method in Activity that removes the current object (I believe this method is working fine and yes, it calls notifyDataSetChanged())
parent.removeObject(currentObject);
}
});
Run Code Online (Sandbox Code Playgroud)
这具有所需的行为,因为按下删除按钮的片段所代表的对象将被删除,并且viewpager将转到下一页.
我的问题是ViewPager不能平滑滚动,而是"立即跳转"到下一个片段.如果我对removeObject()通话进行评论,则平滑滚动有效(但不删除该项目).我相信它与removeObject()setCurrentItem()完成平滑滚动动画之前调用有关?
有关如何解决此问题并实现项目删除+平滑滚动的任何想法?如果我的假设是正确的,我怎样才能确保在删除对象之前完成平滑滚动?
编辑1:
我的假设似乎是对的.如果我把parent.removeObject(currentObject)里面
// ...inside the previously shown public void onClick(View v)...
confirm.postDelayed(new Runnable() { …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter
我有一个包含三个片段的活动.片段使用PagerAdapter使用操作栏选项卡.我想要做的是从主活动中访问活动选项卡式片段中的方法.我已经尝试了下面的代码,但这只是将片段返回为null,所以我猜它无法在标签中找到它!
NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP");
articleFrag.refreshT();
Run Code Online (Sandbox Code Playgroud)
PagerAdapter:
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new NPListFragment();
case 1:
return new PListFragment();
case 2:
return new FavouritesFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出建议吗?我花了大约6个小时,我只是没有取得任何进展来解决这个问题.
嘿伙计们我遇到了严重的问题.我有一个父片段,其中有viewpager和tablayout.Viewpager保存具有与之关联的不同内容的片段.每次思考都可以在滑动时正常工作,但每当我点击tablayout的不同选项卡时,SwipableFragment的categoryId和categoryName就会更改为相邻选项卡的SwipableFragmet到可见片段.
基本上当我启动FragmentAllNews(包含一个ViewPager)时,它会显示第二个片段/页面而不是第一个片段/页面,当我向第二个片段移动时,我会看到第三个...换句话说,它总是显示下一个或前一个片段/页面取决于滑动方向(左或右).
对不起,我的英语不好 :(
这是我的Fragments和FragmentStatePagerAdater类
public class FragmentAllNews extends Fragment {
@Bind(R.id.tab_layout)
TabLayout tabLayout;
@Bind(R.id.all_news_viewpager)
ViewPager viewPager;
SessionManager sessionManager;
String categoryId;
String categoryName;
ArrayList<TabModel> tabs;
public static FragmentAllNews createNewInstance() {
FragmentAllNews fragmentAllNews = new FragmentAllNews();
return fragmentAllNews;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sessionManager = new SessionManager(getActivity());
tabs = sessionManager.getSwitchedNewsValue() == 0 ?
StaticStorage.getTabData(0) :
StaticStorage.getTabData(1);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_all_news, container, false);
ButterKnife.bind(this, …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter
我有3个片段由FragmentPagerAdapter管理,设置为viewPager.
我想逐个加载片段,但是当执行FragmentActivity的onCreate方法时,会执行2个第一个片段(onCreateView方法).
我试图用setOffscreenPageLimit方法限制片段加载但没有任何改变.
mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
pager = (ViewPager) super.findViewById(R.id.tabviewpager);
pager.setOffscreenPageLimit(0);
pager.setAdapter(this.mPagerAdapter);
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助 .
android android-fragments android-viewpager fragmentpageradapter
这将是关于标签的最后一个问题,我保证:)(也许)所以从以前的问题和尝试和错误我有FragmentPagerAdapter调用PagerAdapter创建一些选项卡,并使我能够动态创建新选项卡.问题是新选项卡将始终插入到现有选项卡的右侧:
(图片: 
我尝试了以下方法:
添加一个静态条目"null",在创建初始选项卡集时会跳过该条目.然后在创建"Temp Tab"时,我可以将该条目覆盖到我想要的任何片段.给了我一些奇怪的IllegalSTateException ...
我认为这将是最好的,实际上真的很想工作:而不是添加片段:
private final List<Fragment> mFragments = new ArrayList<Fragment>();
public void addFragment(Fragment fragment) {
mFragments.add(fragment);
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)使用
mFragments.add(0, fragment);
Run Code Online (Sandbox Code Playgroud)
但它给出了一条带有消息的IllegalStateException:
Can't change tag of fragment ChatFragment
Run Code Online (Sandbox Code Playgroud)
当我尝试添加临时片段时.现在,有两个问题:
有没有办法绕过该片段选项卡,我可以暂时取走所有片段标签并重建它们全部或其他东西吗?要么
有没有更好,更优雅的方式来做到这一点?或者我应该重新设计我的UI,以便可以使用右侧的选项卡?:P
编辑:这里有一些代码:(我从不想把死亡之墙发给人们,因为它可能吓跑他们:o)
FragmentPagerAdapter:
public class PagerAdapter extends FragmentPagerAdapter {
private Context mContext;
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
mContext = context;
}
private final List<Fragment> mFragments = new ArrayList<Fragment>();
public void addFragment(Fragment fragment) {
mFragments.add(fragment);
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position); …Run Code Online (Sandbox Code Playgroud) android illegalstateexception fragmentpageradapter android-tabs