比较来自世界各地的卖家的域名和 IT 服务价格

ViewPager 和碎片 — 保持片段状态的正确方法是什么?

碎片似乎非常适合逻辑分离 UI 在某些模块上。 但是一起。
ViewPager

他的生命周期对我来说仍然有雾。 所以大师的想法非常必要!

编辑

看到下面的一个愚蠢的解决方案 ;-/

规模

主要活动有
ViewPager

用碎片。 这些碎片可以为他人实现一些不同的逻辑。 /更换/ 操作,因此这些片段通过在Action中通过回调界面填充。 一切都在第一次发布时正常工作,但是!....

问题

在重建行动时 /例如,在更改方向时/, 与碎片发生一样
ViewPager

. 代码 /你会在下面找到/ 说每次创建一个动作时,我都会尝试创建一个新的片段适配器
ViewPager

, 与碎片相同 /也许这是问题/, 但 FragmentManager 已经让所有这些碎片在某处 /在哪里?/ 并为他们推出娱乐机制。 因此,娱乐机制导致碎片 "old" onAttach, onCreateView 等等。使用我的回调接口,使用实现的操作方法调用数据初始化。 但此方法表示新创建的片段,它是使用该方法创建的 onCreate 行动。

问题

也许我使用错误的模板,但即使在书中 Android 3 Pro 关于这个小说。 所以 ,

不客气

, 给我一个或两个震惊,并指定如何正确。 非常感谢!

代码

主要活动


public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {

private MessagesFragment mMessagesFragment;

@Override
protected void onCreate/Bundle savedInstanceState/ {
Logger.d/"Dash onCreate"/;
super.onCreate/savedInstanceState/;

setContentView/R.layout.viewpager_container/;
new DefaultToolbar/this/;

// create fragments to use
mMessagesFragment = new MessagesFragment//;
mStreamsFragment = new StreamsFragment//;

// set titles and fragments for view pager
Map<string, fragment=""> screens = new LinkedHashMap<string, fragment="">//;
screens.put/getApplicationContext//.getString/R.string.dashboard_title_dumb/, new DumbFragment///;
screens.put/getApplicationContext//.getString/R.string.dashboard_title_messages/, mMessagesFragment/;

// instantiate view pager via adapter
mPager = /ViewPager/ findViewById/R.id.viewpager_pager/;
mPagerAdapter = new BasePagerAdapter/screens, getSupportFragmentManager///;
mPager.setAdapter/mPagerAdapter/;

// set title indicator
TitlePageIndicator indicator = /TitlePageIndicator/ findViewById/R.id.viewpager_titles/;
indicator.setViewPager/mPager, 1/;

}

/* set of fragments callback interface implementations */

@Override
public void onMessageInitialisation// {

Logger.d/"Dash onMessageInitialisation"/;
if /mMessagesFragment != null/
mMessagesFragment.loadLastMessages//;
}

@Override
public void onMessageSelected/Message selectedMessage/ {

Intent intent = new Intent/this, StreamActivity.class/;
intent.putExtra/Message.class.getName//, selectedMessage/;
startActivity/intent/;
}


BasePagerActivity 助理AK。


public class BasePagerActivity extends FragmentActivity {

BasePagerAdapter mPagerAdapter;
ViewPager mPager;
}


适配器


public class BasePagerAdapter extends FragmentPagerAdapter implements TitleProvider {

private Map<string, fragment=""> mScreens;

public BasePagerAdapter/Map<string, fragment=""> screenMap, FragmentManager fm/ {

super/fm/;
this.mScreens = screenMap;
}

@Override
public Fragment getItem/int position/ {

return mScreens.values//.toArray/new Fragment[mScreens.size//]/[position];
}

@Override
public int getCount// {

return mScreens.size//;
}

@Override
public String getTitle/int position/ {

return mScreens.keySet//.toArray/new String[mScreens.size//]/[position];
}

// hack. we don't want to destroy our fragments and re-initiate them after
@Override
public void destroyItem/View container, int position, Object object/ {

// TODO Auto-generated method stub
}

}


分段


public class MessagesFragment extends ListFragment {

private boolean mIsLastMessages;

private List<message> mMessagesList;
private MessageArrayAdapter mAdapter;

private LoadMessagesTask mLoadMessagesTask;
private OnMessageListActionListener mListener;

// define callback interface
public interface OnMessageListActionListener {
public void onMessageInitialisation//;
public void onMessageSelected/Message selectedMessage/;
}

@Override
public void onAttach/Activity activity/ {
super.onAttach/activity/;
// setting callback
mListener = /OnMessageListActionListener/ activity;
mIsLastMessages = activity instanceof DashboardActivity;

}

@Override
public View onCreateView/LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState/ {
inflater.inflate/R.layout.fragment_listview, container/;
mProgressView = inflater.inflate/R.layout.listrow_progress, null/;
mEmptyView = inflater.inflate/R.layout.fragment_nodata, null/;
return super.onCreateView/inflater, container, savedInstanceState/;
}

@Override
public void onActivityCreated/Bundle savedInstanceState/ {
super.onActivityCreated/savedInstanceState/;

// instantiate loading task
mLoadMessagesTask = new LoadMessagesTask//;

// instantiate list of messages
mMessagesList = new ArrayList<message>//;
mAdapter = new MessageArrayAdapter/getActivity//, mMessagesList/;
setListAdapter/mAdapter/;
}

@Override
public void onResume// {
mListener.onMessageInitialisation//;
super.onResume//;
}

public void onListItemClick/ListView l, View v, int position, long id/ {
Message selectedMessage = /Message/ getListAdapter//.getItem/position/;
mListener.onMessageSelected/selectedMessage/;
super.onListItemClick/l, v, position, id/;
}

/* public methods to load messages from host acitivity, etc... */
}


决定

一个愚蠢的解决方案是在里面保持碎片 onSaveInstanceState /HOSTA活动/ 通过 putFragment 并让他们里面 onCreate 穿过 getFragment. 但我仍然有一种奇怪的感觉,一切都不应该工作......请参阅下面的代码:


@Override
protected void onSaveInstanceState/Bundle outState/ {

super.onSaveInstanceState/outState/;
getSupportFragmentManager//
.putFragment/outState, MessagesFragment.class.getName//, mMessagesFragment/;
}

protected void onCreate/Bundle savedInstanceState/ {
Logger.d/"Dash onCreate"/;
super.onCreate/savedInstanceState/;

...
// create fragments to use
if /savedInstanceState != null/ {
mMessagesFragment = /MessagesFragment/ getSupportFragmentManager//.getFragment/
savedInstanceState, MessagesFragment.class.getName///;
StreamsFragment.class.getName///;
}
if /mMessagesFragment == null/
mMessagesFragment = new MessagesFragment//;
...
}


</message></message></string,></string,></string,></string,>
已邀请:

卫东

赞同来自:

什么时候
FragmentPagerAdapter

添加片段K. FragmentManager, 它使用基于特定位置的特殊标签,其中将放置片段。
FragmentPagerAdapter.getItem/int position/

仅在此职位不存在片段时才会调用。 转弯后 Android 注意 , 他已经创造了/为这个特定位置保存了一个片段,因此他只是试图再次连接他
FragmentManager.findFragmentByTag//

, 而不是创造一个新的。 使用该方法时,所有这些都是免费的
FragmentPagerAdapter

, 这就是片段初始化代码通常在方法中的原因
getItem/int/

.

即使我们没有使用
FragmentPagerAdapter

, 每次都没有忍受创造一个新的片段
Activity.onCreate/Bundle/

. 正如您在添加片段的情况下已经注意到的那样 FragmentManager, 转动后将为您重新创建,并且无需再次添加它。 在使用碎片时,这是错误的常见原因。

使用碎片时的通常方法如下:


protected void onCreate/Bundle savedInstanceState/ {
super.onCreate/savedInstanceState/;

...

CustomFragment fragment;
if /savedInstanceState != null/ {
fragment = /CustomFragment/ getSupportFragmentManager//.findFragmentByTag/"customtag"/;
} else {
fragment = new CustomFragment//;
getSupportFragmentManager//.beginTransaction//.add/R.id.container, fragment, "customtag"/.commit//;
}

...

}


使用
FragmentPagerAdapter

我们将控制片段传送到适配器,不应执行上述步骤。 默认情况下,它将仅在前部和背面预加载一个片段 /虽然如果你不使用他并没有摧毁它们
FragmentStatePagerAdapter

/., 这是控制的
http://developer.android.com/r ... %2529
. 因此,适配器外部的片段上的直接呼叫方法不保证,因为它们甚至可能甚至不活跃。

简而言之,你决定使用
putFragment

, 能够随后得到一个链接,没有那么疯狂,与使用碎片的通常方法没有那么不同 /更高/. 否则,很难获得链接,因为适配器添加了片段,而不是您个人的。 只是确保这一点
offscreenPageLimit

它足以在任何时候加载所需的碎片,因为您依赖于其存在。 它需要延迟装载的可能性 ViewPager, 但似乎这就是你想要的申请。

另一种方法是覆盖
FragmentPageAdapter.instantiateItem/View, int/

并将链接保存到从Supervonka返回之前退回的片段 /如果他已经存在,他有逻辑找到片段/.

对于更完整的图片,请看看一些来源
http://grepcode.com/file/repos ... v%3Df
/短的/ 和
http://grepcode.com/file/repos ... v%3Df
/长/.

喜特乐

赞同来自:

我想提供扩展的解决方案


antonyt

并提到覆盖
FragmentPageAdapter.instantiateItem/View, int/

, 保存要创建的链接
Fragments

, 所以你可以稍后工作。 它也应该与之合作
FragmentStatePagerAdapter

; 有关详细信息,请参阅注释。

这是如何获得链接的简单示例
Fragments

, 回来
FragmentPagerAdapter

, 哪个不依赖于内部集
tags


Fragments

. 关键是覆盖

http://grepcode.com/file/repos ... %2383
并在那里保存链接



不是V.
getItem//

.


public class SomeActivity extends Activity {
private FragmentA m1stFragment;
private FragmentB m2ndFragment;

// other code in your Activity...

private class CustomPagerAdapter extends FragmentPagerAdapter {
// other code in your custom FragmentPagerAdapter...

public CustomPagerAdapter/FragmentManager fm/ {
super/fm/;
}

@Override
public Fragment getItem/int position/ {
// Do NOT try to save references to the Fragments in getItem//,
// because getItem// is not always called. If the Fragment
// was already created then it will be retrieved from the FragmentManger
// and not here /i.e. getItem// won't be called again/.
switch /position/ {
case 0:
return new FragmentA//;
case 1:
return new FragmentB//;
default:
// This should never happen. Always account for each position above
return null;
}
}

// Here we can finally safely save a reference to the created
// Fragment, no matter where it came from /either getItem// or
// FragmentManger/. Simply save the returned Fragment from
// super.instantiateItem// into an appropriate reference depending
// on the ViewPager position.
@Override
public Object instantiateItem/ViewGroup container, int position/ {
Fragment createdFragment = /Fragment/ super.instantiateItem/container, position/;
// save the appropriate reference depending on position
switch /position/ {
case 0:
m1stFragment = /FragmentA/ createdFragment;
break;
case 1:
m2ndFragment = /FragmentB/ createdFragment;
break;
}
return createdFragment;
}
}

public void someMethod// {
// do work on the referenced Fragments, but first check if they
// even exist yet, otherwise you'll get an NPE.

if /m1stFragment != null/ {
// m1stFragment.doWork//;
}

if /m2ndFragment != null/ {
// m2ndFragment.doSomeWorkToo//;
}
}
}


或者

如果您愿意与之合作
tags

而不是类成员变量/链接
Fragments

, 你也可以捕获
tags

, 放
FragmentPagerAdapter

以同样的方式:
NOTE: 这不适用于
FragmentStatePagerAdapter

, 因为它没有安装
tags

创造自己的时候
Fragments

.


@Override
public Object instantiateItem/ViewGroup container, int position/ {
Fragment createdFragment = /Fragment/ super.instantiateItem/container, position/;
// get the tags set by FragmentPagerAdapter
switch /position/ {
case 0:
String firstTag = createdFragment.getTag//;
break;
case 1:
String secondTag = createdFragment.getTag//;
break;
}
// ... save the tags somewhere so you can reference them later
return createdFragment;
}


请注意,此方法不认为模仿内部
tag

, 已确立的
FragmentPagerAdapter

, 而是使用权利 APIs 为了他们的提取。 所以即使
tag

改变未来版本
SupportLibrary

, 你仍然是安全的。

不要忘记

, 依赖于你的设计
Activity

,
Fragments

, 您正在尝试处理您是否仍然存在,但可能不存在,因此您必须考虑到这一点,进行检查
null

在使用您的链接之前。

除了 , 如果代替

这你合作
FragmentStatePagerAdapter

, 然后你不想保持紧张的联系
Fragments

, 因为你可能有很多它们,并且严格的链接将在内存中忽略它们。 相反,保存链接
Fragment

在变量中
WeakReference

而不是标准。 类似于这个:


WeakReference<fragment> m1stFragment = new WeakReference<fragment>/createdFragment/;
// ...and access them like so
Fragment firstFragment = m1stFragment.get//;
if /firstFragment != null/ {
// reference hasn't been cleared yet; do work...
}


</fragment></fragment>

龙天

赞同来自:

我发现了另一个相对简单的问题解决问题。

正如你所看到的那样
http://grepcode.com/file/repos ... 28int,int%29
, 碎片管理
FragmentPagerAdapter

, 商店B.
FragmentManager

在标记下由:


String tag="android:switcher:" + viewId + ":" + index;



viewId

- 这是
container.getId//

,
container

- 这是您的实例
ViewPager

.
index

- 这是片段的位置。 因此,您可以保存对象标识符
outState

:


@Override
protected void onSaveInstanceState/Bundle outState/ {
super.onSaveInstanceState/outState/;
outState.putInt/"viewpagerid" , mViewPager.getId// /;
}

@Override
protected void onCreate/Bundle savedInstanceState/ {
setContentView/R.layout.activity_main/;
if /savedInstanceState != null/
viewpagerid=savedInstanceState.getInt/"viewpagerid", -1 /;

MyFragmentPagerAdapter titleAdapter = new MyFragmentPagerAdapter /getSupportFragmentManager// , this/;
mViewPager = /ViewPager/ findViewById/R.id.pager/;
if /viewpagerid != -1 /{
mViewPager.setId/viewpagerid/;
}else{
viewpagerid=mViewPager.getId//;
}
mViewPager.setAdapter/titleAdapter/;


如果您想联系此碎片,您可以获得 if 的
FragmentManager

, 例如:


getSupportFragmentManager//.findFragmentByTag/"android:switcher:" + viewpagerid + ":0"/

诸葛浮云

赞同来自:

我想为替代解决方案提供替代解决方案,也许有点不同的情况,因为我的许多搜索答案不断导致我到这个主题。

我的情况

- 我正在创造 / 我动态添加页面并将它们移动到 ViewPager, 但是在旋转时 /onConfigurationChange/ 我得到了一个新的页面,因为当然 OnCreate 再次打电话。 但我想保存到旋转前创建的所有页面的链接。

问题

- 我创建的每个片段都没有唯一标识符,因此唯一的参考方式是在转动后的数组中以某种方式保存链接/配置更改。

圆形的

关键概念是采取行动 /显示碎片/ 还管理了对现有片段的一系列引用,因为此操作可以使用包 onSaveInstanceState


public class MainActivity extends FragmentActivity


因此,在此活动的框架内,我声明私人参与者来跟踪开放页面。


private List<fragment> retainedPages = new ArrayList<fragment>//;


它每次都更新 onSaveInstanceState 叫做并恢复 onCreate


@Override
protected void onSaveInstanceState/Bundle outState/ {
retainedPages = _adapter.exportList//;
outState.putSerializable/"retainedPages", /Serializable/ retainedPages/;
super.onSaveInstanceState/outState/;
}


..因此,一旦保存,它就可以删除......


@Override
public void onCreate/Bundle savedInstanceState/ {
super.onCreate/savedInstanceState/;
setContentView/R.layout.activity_main/;

if /savedInstanceState != null/ {
retainedPages = /List<fragment>/ savedInstanceState.getSerializable/"retainedPages"/;
}
_mViewPager = /CustomViewPager/ findViewById/R.id.viewPager/;
_adapter = new ViewPagerAdapter/getApplicationContext//, getSupportFragmentManager///;
if /retainedPages.size// &gt; 0/ {
_adapter.importList/retainedPages/;
}
_mViewPager.setAdapter/_adapter/;
_mViewPager.setCurrentItem/_adapter.getCount//-1/;
}


这些是主要活动的必要变化,因此我需要我的成员和方法 FragmentPagerAdapter, 所以它在里面工作


public class ViewPagerAdapter extends FragmentPagerAdapter


相同的设计 /如上所示 MainActivity /


private List<fragment> _pages = new ArrayList<fragment>//;


和这种同步 /如上所述 onSaveInstanceState/ 通过方法支持


public List<fragment> exportList// {
return _pages;
}

public void importList/List<fragment> savedPages/ {
_pages = savedPages;
}


最后,在碎片类中


public class CustomFragment extends Fragment


为了让所有这项工作,首先有两个变化


public class CustomFragment extends Fragment implements Serializable


然后加入它 onCreate, 这样碎片没有被摧毁


setRetainInstance/true/;


我仍然在缠绕碎片和生命周期周围的过程中 Android, 因此,这里的警告在于,在这种方法中可能存在冗余/效率低下。 但它适合我,我希望它对其他具有类似案例的人有用。
</fragment></fragment></fragment></fragment></fragment></fragment></fragment>

卫东

赞同来自:

我的决定非常粗鲁,但它有效:由于我的碎片从保存的数据动态创建,我只需删除所有片段
PageAdapter

在打电话之前
super.onSaveInstanceState//

, 然后在创建活动时重新创建它们:


@Override
protected void onSaveInstanceState/Bundle outState/ {
outState.putInt/"viewpagerpos", mViewPager.getCurrentItem// /;
mSectionsPagerAdapter.removeAllfragments//;
super.onSaveInstanceState/outState/;
}


你不能删除它们
onDestroy//

, 否则,您将获得此异常:


java.lang.IllegalStateException:

Can not perform this action after
onSaveInstanceState


以下是页面适配器中的代码:


public void removeAllfragments//
{
if / mFragmentList != null / {
for / Fragment fragment : mFragmentList / {
mFm.beginTransaction//.remove/fragment/.commit//;
}
mFragmentList.clear//;
notifyDataSetChanged//;
}
}


我只是保留当前页面并恢复它
onCreate//

, 在碎片创造之后。


if /savedInstanceState != null/
mViewPager.setCurrentItem/ savedInstanceState.getInt/"viewpagerpos", 0 / /;

三叔

赞同来自:

这是什么
BasePagerAdapter

? 您必须使用标准寻呼机适配器之一
FragmentPagerAdapter

, 或者
FragmentStatePagerAdapter

, 取决于你是否想要不再需要的碎片
ViewPager

, 或者附近储存 /第一的/, 或者保持其状态 /第二/ 如有必要,它是重新创建的。

使用示例代码
ViewPager

能够被找到的
http://developer.android.com/t ... mples
确实,在实例之间管理表示寻呼机中的片段 activity 有点困难,因为
FragmentManager

该框架负责保存状态并恢复寻呼机所做的任何活动碎片。 所有这些实际上都意味着初始化期间的适配器必须确保它与任何恢复的片段重新连接。 你可以看看代码
FragmentPagerAdapter

或者
FragmentStatePagerAdapter

, 看它是如何完成的。

君笑尘

赞同来自:

如果有人对他们的事实有问题 FragmentStatePagerAdapter 不恢复他们的状况 fragments...ie...new 他们创建的碎片 FragmentStatePagerAdapter 而不是从州恢复它们......

确保你打电话
ViewPager.setOffscreenPageLimit//

BEFORE 你打电话
ViewPager.setAdapter/fragmentStatePagerAdapter/


随传随到
ViewPager.setOffscreenPageLimit//

...ViewPager

立即地

调用您的适配器并尝试获取碎片。 它可以发生在之前 ViewPager 将有机会恢复碎片 savedInstanceState/因此,创建无法从中重新初始化的新片段 SavedInstanceState, 因为他们是新的/.

卫东

赞同来自:

我发明了这种简单而优雅的解决方案。 他建议,活动负责创建片段,并且适配器简单地为它们提供服务。

这是一个适配器代码 /这里没有什么奇怪的是,除了这个事实
mFragments

- 这是活动支持的片段列表。/


class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {

public MyFragmentPagerAdapter/FragmentManager fm/ {
super/fm/;
}

@Override
public Fragment getItem/int position/ {
return mFragments.get/position/;
}

@Override
public int getCount// {
return mFragments.size//;
}

@Override
public int getItemPosition/Object object/ {
return POSITION_NONE;
}

@Override
public CharSequence getPageTitle/int position/ {
TabFragment fragment = /TabFragment/mFragments.get/position/;
return fragment.getTitle//;
}
}


这个磁通量的整个问题是获得与碎片的链接 "old", 因此,我在操作中使用此代码 onCreate.


if /savedInstanceState!=null/ {
if /getSupportFragmentManager//.getFragments//!=null/ {
for /Fragment fragment : getSupportFragmentManager//.getFragments/// {
mFragments.add/fragment/;
}
}
}


当然,如果需要,您可以另外配置此代码,例如,确保片段是某个类的实例。

郭文康

赞同来自:

要在更改方向后获得碎片,必须使用 .getTag//.


getSupportFragmentManager//.findFragmentByTag/"android:switcher:" + viewPagerId + ":" + positionOfItemInViewPager/


对于一点更大的加工,我自己写了自己的 ArrayList 为我的 PageAdapter, 得到一个片段 viewPagerId 和 FragmentClass 在任何位置:


public class MyPageAdapter extends FragmentPagerAdapter implements Serializable {
private final String logTAG = MyPageAdapter.class.getName// + ".";

private ArrayList<mypagebuilder> fragmentPages;

public MyPageAdapter/FragmentManager fm, ArrayList<mypagebuilder> fragments/ {
super/fm/;
fragmentPages = fragments;
}

@Override
public Fragment getItem/int position/ {
return this.fragmentPages.get/position/.getFragment//;
}

@Override
public CharSequence getPageTitle/int position/ {
return this.fragmentPages.get/position/.getPageTitle//;
}

@Override
public int getCount// {
return this.fragmentPages.size//;
}


public int getItemPosition/Object object/ {
//benötigt, damit bei notifyDataSetChanged alle Fragemnts refrehsed werden

Log.d/logTAG, object.getClass//.getName///;
return POSITION_NONE;
}

public Fragment getFragment/int position/ {
return getItem/position/;
}

public String getTag/int position, int viewPagerId/ {
//getSupportFragmentManager//.findFragmentByTag/"android:switcher:" + R.id.shares_detail_activity_viewpager + ":" + myViewPager.getCurrentItem///

return "android:switcher:" + viewPagerId + ":" + position;
}

public MyPageBuilder getPageBuilder/String pageTitle, int icon, int selectedIcon, Fragment frag/ {
return new MyPageBuilder/pageTitle, icon, selectedIcon, frag/;
}


public static class MyPageBuilder {

private Fragment fragment;

public Fragment getFragment// {
return fragment;
}

public void setFragment/Fragment fragment/ {
this.fragment = fragment;
}

private String pageTitle;

public String getPageTitle// {
return pageTitle;
}

public void setPageTitle/String pageTitle/ {
this.pageTitle = pageTitle;
}

private int icon;

public int getIconUnselected// {
return icon;
}

public void setIconUnselected/int iconUnselected/ {
this.icon = iconUnselected;
}

private int iconSelected;

public int getIconSelected// {
return iconSelected;
}

public void setIconSelected/int iconSelected/ {
this.iconSelected = iconSelected;
}

public MyPageBuilder/String pageTitle, int icon, int selectedIcon, Fragment frag/ {
this.pageTitle = pageTitle;
this.icon = icon;
this.iconSelected = selectedIcon;
this.fragment = frag;
}
}

public static class MyPageArrayList extends ArrayList<mypagebuilder> {
private final String logTAG = MyPageArrayList.class.getName// + ".";

public MyPageBuilder get/Class cls/ {
// Fragment über FragmentClass holen
for /MyPageBuilder item : this/ {
if /item.fragment.getClass//.getName//.equalsIgnoreCase/cls.getName//// {
return super.get/indexOf/item//;
}
}
return null;
}

public String getTag/int viewPagerId, Class cls/ {
// Tag des Fragment unabhängig vom State z.B. nach bei Orientation change
for /MyPageBuilder item : this/ {
if /item.fragment.getClass//.getName//.equalsIgnoreCase/cls.getName//// {
return "android:switcher:" + viewPagerId + ":" + indexOf/item/;
}
}
return null;
}
}


所以只是创造 MyPageArrayList 用碎片:


myFragPages = new MyPageAdapter.MyPageArrayList//;

myFragPages.add/new MyPageAdapter.MyPageBuilder/
getString/R.string.widget_config_data_frag/,
R.drawable.ic_sd_storage_24dp,
R.drawable.ic_sd_storage_selected_24dp,
new WidgetDataFrag////;

myFragPages.add/new MyPageAdapter.MyPageBuilder/
getString/R.string.widget_config_color_frag/,
R.drawable.ic_color_24dp,
R.drawable.ic_color_selected_24dp,
new WidgetColorFrag////;

myFragPages.add/new MyPageAdapter.MyPageBuilder/
getString/R.string.widget_config_textsize_frag/,
R.drawable.ic_settings_widget_24dp,
R.drawable.ic_settings_selected_24dp,
new WidgetTextSizeFrag////;


并将它们添加到 viewPager:


mAdapter = new MyPageAdapter/getSupportFragmentManager//, myFragPages/;
myViewPager.setAdapter/mAdapter/;


之后,您可以使用其类更改方向正确片段后:


WidgetDataFrag dataFragment = /WidgetDataFrag/ getSupportFragmentManager//
.findFragmentByTag/myFragPages.getTag/myViewPager.getId//, WidgetDataFrag.class//;


</mypagebuilder></mypagebuilder></mypagebuilder>

诸葛浮云

赞同来自:

添加:


@SuppressLint/"ValidFragment"/


在你的职业之前。

这不起作用这样做:


@SuppressLint/{ "ValidFragment", "HandlerLeak" }/

要回复问题请先登录注册