相关疑难解决方法(0)

Android系统.片段getActivity()有时会返回null

在开发者控制台错误报告中,有时我会看到有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

187
推荐指数
5
解决办法
14万
查看次数

使用FragmentPagerAdapter时如何获取现有片段

我有问题使我的片段通过Activity使用FragmentPagerAdapter,作为帮助类来实现对标签的管理以及连接ViewPager关联的所有细节TabHost.我的实现FragmentPagerAdapter与Android示例项目Support4Demos提供的一样.

主要问题是FragmentManager当我没有Id或Tag时,如何从特定片段中获取特定片段?FragmentPagerAdapter正在创建片段并自动生成Id和标签.

android android-fragments fragmentpageradapter

96
推荐指数
6
解决办法
7万
查看次数

在Activity被杀死并重新创建后,片段仍然存在

我有一个FragmentActivity(支持片段),我通过代码创建片段并将它们放入FrameLayouts.到目前为止一切正常.现在,如果我离开应用程序返回一切正常,只要系统不会杀死我的活动(或者我使用DDMS中的停止按钮执行此操作).如果发生这种情况,则不会调用任何内容,我的Activity也会被杀死.没有调用onDestroy.

因此,当我重新打开我的应用程序时,所有碎片仍然存在,并且我得到NullPointerExeptions因为他们试图完成他们的工作.片段不应该存在于App的这种状态中,这对我来说是个问题.

我不需要它们在backStack中,所以我不把它们放在那里,不能调用popBackStack()来摆脱它们.

如何在onCreate()中重置FragmentManager,或者只是确保片段也被销毁?

android kill-process ondestroy android-fragments android-fragmentactivity

24
推荐指数
2
解决办法
1万
查看次数

如何从活动(viewpager)更新片段内容?

我有一个带有两个片段的简单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)

android android-fragments android-viewpager

18
推荐指数
1
解决办法
5万
查看次数

使用新内容刷新ViewPager的奇怪问题:

我从一个被解析为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)

android android-fragments android-viewpager

9
推荐指数
1
解决办法
1万
查看次数

从FragmentStatePagerAdapter中删除片段

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是因为initiateItemmSavedState再次填满了我.而且我确信在通知我之后我adapter不会持有任何这些Fragments.

此外,如果你想这样做改变你的mSaveState,protected所以你将能够从扩展类(在我的情况下 …

android android-fragments

9
推荐指数
2
解决办法
9519
查看次数

FragmentPagerAdapter与ViewPager和两个片段.转到第二个中的第一个并更新第一个文本

我不熟悉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

8
推荐指数
1
解决办法
9821
查看次数

如何在FragmentStatePagerAdapter中动态添加页面

我知道这个问题需要很多次,但经过多次研究后我都没有得到答复.在我的主要活动中,我有一个视图寻呼机,我为它设置了一个适配器:

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)

android fragmentstatepageradapter

6
推荐指数
1
解决办法
7149
查看次数

getActivity()在ActionBar Fragment中返回null

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)

android nullpointerexception fragmentpageradapter

0
推荐指数
1
解决办法
1682
查看次数