我正在制作一个具有 4 个主要视图的应用程序。我希望所有这些都保留在顶部的 LIST 菜单上(现在可以了)。
使用 Fragments,我可以在不实际转到其他活动的情况下更改视图,但是由于我的一个视图有一个 ViewPager,它根本无法工作(当我第一次加载视图时,内容还可以,但是在第二个时间,ViewPager 上的视图消失,只有当我离开 2 个索引位置并返回时才会出现)(见图片,显示第一次加载时间,然后第二次)

请注意,ViewPager 不是要显示菜单项,它实际上是当前菜单项的 Fragment 的一部分(在这种情况下,“Simula'c~ao”)
我的问题是:这是一个已知问题,是否有简单的方法可以解决,或者我必须以其他方式解决?我已经在互联网上搜索过这个问题,但对我没有任何作用(无效,设置getItemPosition返回POSITION_NONE......)
我查看了 ViewPager 类,似乎一切正常,我对其进行了修改,以便每次渲染视图时,它都会强制渲染所有内容,但这种方式都不起作用。
我试图将可见性设置为 GONE 和 VISIBLE
我试图分离和连接适配器
试图缓存视图,并返回缓存。
似乎奏效的一件事:改变手机的方向。那奏效了。
尝试了很多我什至记得的事情......我对此有点生气,因为过去的24小时根本没有帮助我解决这个“谜团”。我希望你们中的一些人可以 =]
我的代码:https : //www.dropbox.com/s/u4mlxr3k6ta9yrm/MainActivity.java https://www.dropbox.com/s/2dqfnzjs2wl89hj/SimulationFragment.java
浏览次数:https : //www.dropbox.com/s/d6ruc1zjovqu6ob/activity_main.xml https://www.dropbox.com/s/lp1iea13klr77iq/activity_simulation.xml https://www.dropbox.com/s/1mkl3jqmo7g4wh8/ item_simulation.xml
我目前在我的主要活动中有一个帖子下载东西frow web,然后我需要在下载完成后更新ViewPager中的Fragments.
下载由服务处理,并在完成后广播Intent.
所以,基本上,我的主Activity中的代码是:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
((PositionFragment)mPagerAdapter.getItem(0)).updateUI();
}
}
Run Code Online (Sandbox Code Playgroud)
和我的PositionFragment:
public void updateUI() {
mActivity = getActivity();
Run Code Online (Sandbox Code Playgroud)
我真的不明白这是怎么回事.这听起来很简单,但我必须遗漏一些东西!
任何的想法?
编辑:我的适配器:
public class PageAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PageAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
Run Code Online (Sandbox Code Playgroud) 我在这里使用Streets Of Boston的答案保存了片段对象
并拉出一个片段
Fragment fragment = myPagerAdapter.getRegisteredFragments(nowPosition);
if (fragment == null)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
但我无法从片段对象片段访问公共方法.
这个方法是一个片段
public void dowork()
{
//WORK!
}
public static void dowork2()
{
//WORK!
}
Run Code Online (Sandbox Code Playgroud)
fragment.dowork(); - >找不到dowork
fragment.dowork2(); - >找不到dowork2
怎么访问?
谢谢.
我想知道如何在holoeverywhere中执行这些操作:
将滑块插件与tabber结合使用时,可以参考活动中当前可见且活动的片段.
从活动/其他片段中获取对TabsTabsSwipeFragment的引用,并动态禁用/启用滑动.
我想从FragmentActivity中更改片段中的ImageView(在代码中创建).(XML中没有片段和标记).
从FragmentActivity扩展的MainActivity和从GooglePlayServicesClient.ConnectionCallbacks实现的:
...
FragmentAdapter mAdapter;
ViewPager mPager;
...
public void onCreate(Bundle savedInstanceState){
...
FragmentManager fm = getSupportFragmentManager();
mAdapter = new FragmentAdapter(fm);
mPager.setAdapter(mAdapter);
...}
@Override
public void onConnected(Bundle connectionHint){
//*** I want to change a ImageView on Fragment1 here
}
Run Code Online (Sandbox Code Playgroud)
从FragmentPagerAdapter扩展的FragmentAdapter:
...
private FragmentManager mFragmentManager;
public FragmentAdapter(FragmentManager fm){
super(fm);
}
@Override
public Fragment getItem(int pos){
// String name = makeFragmentName(R.id.mainPager, pos);
// Fragment fragmentObject = mFragmentManager.findFragmentByTag(name);
Fragment fragmentObject = null;
switch(pos){
case 0:
fragmentObject = new Fragment1();
break;
...
}
return …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter android-fragmentactivity
我有一些片段被交换进我的主要活动.初始片段称为BrowseHomeFragment并且最初加载正常,但是当我用新片段替换它然后将其替换回来时我得到以下错误
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:686)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:536)
Run Code Online (Sandbox Code Playgroud)
BrowseHomeFragment的onCreateView方法:
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
InjectionGraph.inject(this);
View view = inflater.inflate(R.layout.fragment_browse, container, false);
ButterKnife.inject(this, view);
addTabsToPagerSlidingTabStrip(inflater);
viewPager.setAdapter(new BrowseHomePagerAdapter(getChildFragmentManager()));
pagerSlidingTabStrip.setViewPager(viewPager);
// has to set page change listener in indicator
pagerSlidingTabStrip.setOnPageChangeListener(pageChangeListener);
viewPager.setCurrentItem(initialTabIndex);
return view;
}
Run Code Online (Sandbox Code Playgroud)
BrowseHomePagerAdapter
public class BrowseHomePagerAdapter extends FragmentStatePagerAdapter {
private int lastPosition = -1;
@Inject
BrowseHomepageMetricRecorder browseHomepageMetricRecorder;
@Inject
NetworkMonitor networkMonitor;
/**
* …Run Code Online (Sandbox Code Playgroud) getActivity()null如果之前被调用,片段内将返回fragment.onAttach(activity).
fragment.onActivityCreated(savedInstanceState)被称为fragment.onAttach(activity).有关片段生命周期的信息,请参阅developer.android.
我的片段中有一个尝试实例化数据库连接的方法.最初调用该方法时,它可以正常工作.
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Log.d("MyTag", "Activity being created");
if (savedInstanceState == null){
listAdapter.setContext(getActivity());
execSearch(0);
} else { listAdapter.setContext(getActivity()); }
}
public void execSearch(Long searchId) {
MySQLiteHelper dbHelper = new MySQLiteHelper(getActivity());
SQLiteDatabase database = dbHelper.getReadableDatabase();
...
}
Run Code Online (Sandbox Code Playgroud)
现在,当在列表视图中单击按钮后通过接口调用此相同方法时,getActivity()返回null(在片段中).
以下是ListAdapter中的按钮回调:
private final View.OnClickListener editSearchListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Long search_id = (Long) v.getTag();
((MyInterface) context).searchCalled(search_id);
}
};
Run Code Online (Sandbox Code Playgroud)
以及MainActivity中的接口实现:
@Override …Run Code Online (Sandbox Code Playgroud)