在开发者控制台错误报告中,有时我会看到有NPE问题的报告.我不明白我的代码有什么问题.在模拟器上,我的设备应用程序在没有forcecloses的情况下运行良好,但是当调用getActivity()方法时,一些用户在片段类中获得NullPointerException.
活动
pulic class MyActivity extends FragmentActivity{
private ViewPager pager;
private TitlePageIndicator indicator;
private TabsAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
pager = (ViewPager) findViewById(R.id.pager);
indicator = (TitlePageIndicator) findViewById(R.id.indicator);
adapter = new TabsAdapter(getSupportFragmentManager(), false);
adapter.addFragment(new FirstFragment());
adapter.addFragment(new SecondFragment());
indicator.notifyDataSetChanged();
adapter.notifyDataSetChanged();
// push first task
FirstTask firstTask = new FirstTask(MyActivity.this);
// set first fragment as listener
firstTask.setTaskListener((TaskListener) adapter.getItem(0));
firstTask.execute();
}
indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Fragment currentFragment = adapter.getItem(position);
((Taskable) currentFragment).executeTask();
}
@Override
public void onPageScrolled(int …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-asynctask android-fragments android-activity
我正在尝试从ViewPager动态添加和删除片段,添加工作没有任何问题,但删除不能按预期工作.
每次我想删除当前项目时,最后一项将被删除.
我还尝试使用FragmentStatePagerAdapter或在适配器的getItemPosition方法中返回POSITION_NONE.
我究竟做错了什么?
这是一个基本的例子:
MainActivity.java
public class MainActivity extends FragmentActivity implements TextProvider {
private Button mAdd;
private Button mRemove;
private ViewPager mPager;
private MyPagerAdapter mAdapter;
private ArrayList<String> mEntries = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mEntries.add("pos 1");
mEntries.add("pos 2");
mEntries.add("pos 3");
mEntries.add("pos 4");
mEntries.add("pos 5");
mAdd = (Button) findViewById(R.id.add);
mRemove = (Button) findViewById(R.id.remove);
mPager = (ViewPager) findViewById(R.id.pager);
mAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
addNewItem();
}
});
mRemove.setOnClickListener(new OnClickListener() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我想实现这个:

我使用带有FragmentStatePagerAdapter的ViewPager.
我从这个页面的示例开始:http:
//developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html
这是我的ViewPager适配器:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
}
Run Code Online (Sandbox Code Playgroud)
我的ViewPager的每个页面都包含一个带有一些数据的ListView.在我切换到ViewPager中的新页面时,它将非常快速地增加RAM内存.
我该如何删除旧碎片?
我也用过这个,但它什么也没做:
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
super.destroyItem(container, position, object);
} …Run Code Online (Sandbox Code Playgroud) 我有这个活动,它有一个片段.这个片段布局包含一个带有几个片段的视图寻呼机(实际上是两个片段).
创建视图寻呼机时,会创建其适配器,getItem调用它并创建子片段.大.
现在,当我旋转屏幕时,框架处理片段重新创建,适配器在我onCreate的主片段中再次创建,但getItem永远不会被调用,因此我的适配器保存错误的引用(实际上为空)而不是两个片段.
我发现片段管理器(即子片段管理器)包含一个被调用的片段数组mActive,当然这些片段无法从代码中访问.但是有这种getFragment方法:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
Fragment f = mActive.get(index);
if (f == null) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": …Run Code Online (Sandbox Code Playgroud) 我有一个FragmentActivity(支持片段),我通过代码创建片段并将它们放入FrameLayouts.到目前为止一切正常.现在,如果我离开应用程序返回一切正常,只要系统不会杀死我的活动(或者我使用DDMS中的停止按钮执行此操作).如果发生这种情况,则不会调用任何内容,我的Activity也会被杀死.没有调用onDestroy.
因此,当我重新打开我的应用程序时,所有碎片仍然存在,并且我得到NullPointerExeptions因为他们试图完成他们的工作.片段不应该存在于App的这种状态中,这对我来说是个问题.
我不需要它们在backStack中,所以我不把它们放在那里,不能调用popBackStack()来摆脱它们.
如何在onCreate()中重置FragmentManager,或者只是确保片段也被销毁?
android kill-process ondestroy android-fragments android-fragmentactivity
在Android中,您可以在FragmentTransaction中为Fragment设置标记.
为什么我需要为片段设置标签?
如果Fragment根据其标记更改其行为,这是一种好习惯吗?
我有一个FragmentActivity和一个处理2个碎片的ViewPager.
Run Code Online (Sandbox Code Playgroud)public class MyFragmentActivity extends FragmentActivity{
private Fragment f1; private Fragment f2; private ViewPager myPager; private MyFragmentAdapter mFragmentsAdapter; private static ArrayAdapter<Fragment> mFragmentArray; public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.my_layout); myViewPager = (ViewPager) findViewById(R.id.pager_acciones); mFragmentArray = new ArrayAdapter<Fragment>(getApplicationContext(),android.R.layout.simple_list_item_1); f1 = new Fragment(); f1 = new Fragment(); mFragmentArray.add(f1); mFragmentArray.add(f2); mFragmentsAdapter = new MyFragmentAdapter(getSupportFragmentManager()); myPager.setAdapter(mFragmentsAdapter); myPartidoPager.setCurrentItem(0); } public static class MyFragmentAdapter extends FragmentPagerAdapter { public AccionesFragmentAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return mFragmentArray.getCount(); } @Override public Fragment getItem(int position) …
我对操作系统的配置更改处理有疑问,假设我在其 onCreate() 中有一个 Activity,它正在使用该片段中定义的特殊构造函数创建一个(或多个)片段实例。
当设备方向更改时,系统将再次销毁并创建片段,如果我是正确的,它将使用默认(无参数)构造函数来执行此操作,同时活动也会重新创建,并且它将再次使用相同的构造函数实例化片段。我的问题是,内存中会存在两个不同的实例吗?如果不是,如何解决并合而为一?
我有一个带有ActionBarSherlock选项卡的Activity和一个ViewPager.滚动页面时,切换选项卡并更改选项卡,当前页面也会更改.我正在使用一个扩展FragmentStatePagerAdapter的类作为页面视图中的适配器.问题是当设备旋转时,不会调用页面适配器中的getItem,看起来片段引用不正确.这是一个很大的问题,因为用户必须在寻呼机内完成一些字段.这些字段在旋转时正确恢复,但由于我对片段的引用不正确,我无法以正确的方式保存这些值.关于轮换的任何想法?
尝试以编程方式切换片段内的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)
它只会在应用程序首次打开时单击相关按钮时发生,这表明原因是片段尚未附加或创建,
例如,如果我滚动到我要切换到的片段选项卡,然后返回主活动并按下有问题的按钮它将工作.有谁知道解决这个问题的最佳方法?
好吧我发现这个问题的一半关键实际上就是我使用了一个视图寻呼机适配器,这里的一个问题为我的问题提供了很多启示