尝试以编程方式切换片段内的tablayout时,我得到一个空指针异常,
所以我的主要活动有一个标签布局(4个标签)每个标签都有一个包含片段的视图寻呼机,每个片段都有一个标签布局(x个标签数量),一个视图寻呼机拿着一个片段,我可以从这样的任何片段切换我的主要活动选项卡布局的选项卡
TabLayout tabLayout = MainActivity.tabLayout;
TabLayout.Tab tab = tabLayout.getTabAt(2);
tab.select();
Run Code Online (Sandbox Code Playgroud)
但如果我尝试以相同的方式更改其中一个片段的选项卡,我会得到一个空指针
TabLayout tabLayout2 = tabFragOne.tabLayout;
TabLayout.Tab tab2 = tabLayout2.getTabAt(2);
tab2.select();
Run Code Online (Sandbox Code Playgroud)
它只会在应用程序首次打开时单击相关按钮时发生,这表明原因是片段尚未附加或创建,
例如,如果我滚动到我要切换到的片段选项卡,然后返回主活动并按下有问题的按钮它将工作.有谁知道解决这个问题的最佳方法?
好吧我发现这个问题的一半关键实际上就是我使用了一个视图寻呼机适配器,这里的一个问题为我的问题提供了很多启示
精简版:
我有一个具有ViewPager的Activity.ViewPager里面有三个片段.我通过实现Parcelable并将其存储在bundle中来将数据存储在片段中.
现在问题是我在哪里恢复数据.我很困惑,因为(据我所知)ViewPager每次旋转屏幕时都会创建片段的新实例.(创建一个新活动 - >新的ViewPager - > new Fragment).如果我错了,请纠正我.
长版:
我在MainActivity中的ViewPager
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new ForecastFragmentPageAdapter(getSupportFragmentManager(),
ForecastActivity.this));
viewPager.setOffscreenPageLimit(2);
Run Code Online (Sandbox Code Playgroud)
我的FragmentPagerAdapter
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new NowForecastFragment();
} else if (position == 1) {
return new HourlyForecastFragment();
} else {
return new DailyForecastFragment();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的一个片段中保存状态
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save data source
if (nowDataList != null) {
outState.putParcelableArrayList("savedNowDataList", nowDataList);
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
更新:
根据发布到类似问题的其他解决方案,我还添加了setRetainInstance(true); 在我片段的onCreateView中.这就是我保存和恢复状态的方式:
@Override
public …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragment-lifecycle
我正在使用ViewPager并FragmentStatePagerAdapter显示片段.最初有2个片段添加了Fragment1和Fragment2,第3个片段Fragment3在收到服务器的响应后在第2个位置添加.因此,在添加所有页面之后,这应该是ViewPager中的片段序列 - > Fragment1,Fragment3,Fragment2.
问题是在添加了Fragment1和Fragment3之后,如果我在第二个位置添加第三个片段,应用程序正在进行服务器调用,如果我多次进行屏幕旋转,那么在添加第三个片段之后它仍然显示最初在第二个位置处于第二个位置的Fragment2的旧副本位置和第三位置有Fragment2的新副本.所以Fragment3 doest出现在ViewPager中.添加第3片段后的序列 - > Fragment1,Fragment2的旧拷贝,New Fragment2.
我重写onSaveInstanceState,并呼吁super.onSaveInstanceState在我的活动.
我也试过回来POSITION_NONE了getItemPosition.我在某处读到ViewPager保存片段的副本.还可以通过调试我检查了ViewPager包含Fragment2 2份时问题重现,即使getItem的FragmentStatePagerAdapter每个位置返回不同的片段,但仍处于第2位有人出老片段.出于测试目的,getItem我返回Fragment1中的所有位置,以便所有3个页面应该相同,但即使在第二个位置之后,当我再现上述步骤的问题时,它显示了Fragment2的旧副本.
所以如何清除ViewPager它不会保存旧碎片.如何刷新ViewPager,以便它不会保留带有片段的旧副本.我认为问题在于onSaveInstanceState但我需要它.如何ViewPager在保存视图时排除onSaveInstanceState.我尝试过,mViewPager.setSaveEnabled(false)但需要太多记忆.
我发现问题是instantiateItem适配器的方法没有调用getItem,因为返回了旧的片段.
以下是解决方案代码
码:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
Fragment fragment = mFragments.get(position);
if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
destroyItem(container, position, obj);
return super.instantiateItem(container, position);
}else{
return obj;
}
}
Run Code Online (Sandbox Code Playgroud) 我知道人们已经提出了这个问题,但我遵循了所有的答案,我仍然遇到同样的问题.我有两个脚本一个是片段管理器(IngredientsActivity),另一个是片段(OtherList).代码如下
IngredientsActivity
import java.util.ArrayList;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class IngredientsActivity extends FragmentActivity implements ActionBar.TabListener {
private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.check_list);
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// For each of the sections in the app, add a tab to the action bar.
actionBar.addTab(actionBar.newTab().setText("Alcahol").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Juice").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Other").setTabListener(this)); …Run Code Online (Sandbox Code Playgroud) 我该如何保存片段?(它位于活动中)当我旋转屏幕时,重新启动的活动会重新创建片段
我有一个ViewPager活动,在ViewPager适配器中我为每个位置提供Fragment.
一个示例Fragment是DebugFragment.我在下面写了源代码.
public class DebugFragment extends android.support.v4.app.Fragment {
private OnFragmentInteractionListener mListener;
public interface OnFragmentInteractionListener {
void onFragmentInteraction(int someValue);
}
public static DebugFragment newInstance() {
DebugFragment fragment = new DebugFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mListener.onFragmentInteraction(0);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mMessageReceiver,
new IntentFilter("com.android.example.INITIAL_REQUEST"));
}
@Override
public void onDestroy() {
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
@Override
public void onAttach(Context context) …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-fragmentactivity fragment-lifecycle