在开发者控制台错误报告中,有时我会看到有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
我有问题使我的片段通过Activity使用FragmentPagerAdapter,作为帮助类来实现对标签的管理以及连接ViewPager关联的所有细节TabHost.我的实现FragmentPagerAdapter与Android示例项目Support4Demos提供的一样.
主要问题是FragmentManager当我没有Id或Tag时,如何从特定片段中获取特定片段?FragmentPagerAdapter正在创建片段并自动生成Id和标签.
我有一个FragmentActivity(支持片段),我通过代码创建片段并将它们放入FrameLayouts.到目前为止一切正常.现在,如果我离开应用程序返回一切正常,只要系统不会杀死我的活动(或者我使用DDMS中的停止按钮执行此操作).如果发生这种情况,则不会调用任何内容,我的Activity也会被杀死.没有调用onDestroy.
因此,当我重新打开我的应用程序时,所有碎片仍然存在,并且我得到NullPointerExeptions因为他们试图完成他们的工作.片段不应该存在于App的这种状态中,这对我来说是个问题.
我不需要它们在backStack中,所以我不把它们放在那里,不能调用popBackStack()来摆脱它们.
如何在onCreate()中重置FragmentManager,或者只是确保片段也被销毁?
android kill-process ondestroy android-fragments android-fragmentactivity
我有一个带有两个片段的简单viewPager.每个片段都包含一个TextView.我希望能够更新活动中显示的当前textView的文本.
活动:
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ArrayList<Fragment> fragments = new ArrayList<Fragment>();
fragments.add(Fragment.instantiate(this, Live.class.getName()));
fragments.add(Fragment.instantiate(this, Hit.class.getName()));
this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments);
ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
pager.setAdapter(pagerAdapter);
}
}
Run Code Online (Sandbox Code Playgroud)
适配器:
public class MyPagerAdapter extends FragmentPagerAdapter {
private final ArrayList<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, ArrayList<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();
}
}
Run Code Online (Sandbox Code Playgroud)
片段:
public class …Run Code Online (Sandbox Code Playgroud) 我从一个被解析为Application类中对象的Web服务接收数据,在我的例子中,这个对象Report包含一个Tabs应该填充的列表ViewPager.因此,此报告存储在currentReportApplication类的参数中.
每个标签应该是一个页面ViewPager.因此,当我第一次收到数据并解析数据时,所有数据都能完美运行,并且View Pager会填充正确的数据并显示出来.
当我想Report从服务器获取新内容并ViewPager使用已解析为currentReport参数的新数据刷新时,我的问题就出现了.
我ViewPager可以刷卡并且有标签导航,因此当我尝试ViewPager使用新的重新实例化时,Report我看到添加了适量的标签tabHost.由于某种原因,新报告的片段覆盖了普通报告的片段.因此,如果新报告中的选项卡数量大于上一个报告中的选项卡,那么我可以看到上一个报告中的选项卡以及部分新选项卡(例如,在第一个报告中我有一个选项卡,以及在新的我有3然后我看到前一个片段和下一个片段中的最后一个片段).
我从本教程开始我的开发并添加了smoe代码:http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/
这是我的Tab活动代码:
public class TabsViewPagerFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener
{
static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName();
private TabHost mTabHost;
private ViewPager mViewPager;
private HashMap<String, TabInfo> mapTabInfo;
public ViewPagerAdapter mPagerAdapter;
private TextView tvReportName, tvTabTitle;
private Button bBackToParameters;
private Dialog progressDialog;
private SGRaportManagerAppObj application;
private int numberOfTabs = …Run Code Online (Sandbox Code Playgroud) UPDATE
经过一番与这个问题的重大斗争和SO用户的帮助后,我设法解决了这个问题.这就是我clearProgressUpTo现在的样子.
public void clearProgressUpTo(int progress) {
boolean deleted = false;
for (int i = fragments.size() - 1; i > 0; i--) {
int key = fragments.keyAt(i);
if (key != progress) {
fragments.delete(key);
deleted = true;
} else {
break;
}
}
if (deleted)
notifyDataSetChanged(); //prevents recursive call (and IllegalStateException: Recursive entry to executePendingTransactions)
while (mSavedState.size() > progress) {
mSavedState.remove(mSavedState.size()-1);
}
}
Run Code Online (Sandbox Code Playgroud)
我之所以这样做notifyDataSetChanged是因为initiateItem我mSavedState再次填满了我.而且我确信在通知我之后我adapter不会持有任何这些Fragments.
此外,如果你想这样做改变你的mSaveState,protected所以你将能够从扩展类(在我的情况下 …
我不熟悉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
我知道这个问题需要很多次,但经过多次研究后我都没有得到答复.在我的主要活动中,我有一个视图寻呼机,我为它设置了一个适配器:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager mPager;
PagerAdapter mPagerAdapter;
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
String tag = "onActivityResult";
String msg = "omad";
String timeStamp;
Bitmap reducedImage;
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();//content://media/external/images/media/40596
selectedImagePath = getPath(selectedImageUri);// /storage/emulated/0/DCIM/Camera/IMG_20131022_192859.jpg
//reducedImage = reduceImageSize(selectedImagePath);
Bitmap img = BitmapFactory.decodeFile(selectedImagePath);
File Images = new File(MainActivity.root + File.separator + "Images");
String[] Image = …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)