gpt4 book ai didi

Android:升级支持库后使用 findFragmentById() 出现 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 01:30:32 27 4
gpt4 key购买 nike

我刚刚将一个旧的 Android 项目从 Eclipse 切换到 Android Studio,在这个过程中我从旧的支持库版本 19.0.1 进行了更新。至 22.2.0 .在此之后,我在以前的工作代码中遇到了一些错误。我下载了中间的所有 SDK 并检查了错误首先出现的位置,它似乎在版本 21.1.0 中。以上。我查看了 release notes对于该版本,但找不到任何感兴趣的内容。

我的错误是我得到一个 NullPointerException这里。请注意,此方法是 Activity 的一部分,不是 parent Fragment .

public synchronized void onRecipesFiltered(ArrayList<Recipe> filteredRecipes)
{
FilteredRecipesListFragment filteredRecipesListFragment = (FilteredRecipesListFragment)
getSupportFragmentManager().findFragmentById(R.id.mm_filtered_recipes_list_fragment);

// filteredRecipesListFragment becomes null
filteredRecipesListFragment.onRecipesFiltered(filteredRecipes);
}

Fragment我到这里是一个 ListFragment它是 XML 文件的一部分,该文件在应用程序启动时膨胀。好像是这样ListFragment添加到 FragmentManager 父级Fragment在通货膨胀期间。这可能就是为什么我在获取 FragmentManager 时得到空指针的原因的 Activity .因此,我的问题是:

我怎样才能得到 ListFragmentActivity ?是否有必要保留对父项的引用 Fragment得到ListFragment通过其 FragmentManager ?家长Fragment返回时充气 new MyFragment()FragmentPagerAdapter#getItem() , 无处可寻,因此在 Activity 中获得正确的引用有点棘手。 .

还有一件事需要注意:我看到一些消息告诉我应该更新到 JDK 1.7 ,我做了 ( OpenJDK 1.7 )。我不记得我做了什么,但在“外部图书馆”下我看到了<1.7> (/usr/lib/jvm/java-1.7.0-openjdk-amd64) .不确定这是否重要。

最佳答案

我按照 this 解决了这个问题回答。似乎不太可能以一种漂亮的方式从 ViewPager 获取 Fragment,因此它们必须在创建后作为引用保留并在需要时获取。

我把答案的主要代码复制在这里,以防万一。主要思想是将 Fragment 保存在 SparseArray 中,以便在需要时获取它们。它们必须在创建后/删除前插入和删除。

public class MyPagerAdapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

public MyPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public int getCount() {
return ...;
}

@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(...);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}

完成此操作后,我可以使用 getChildFragmentManager() 将我的方法重写为以下内容,如@Skizo 所述:

public synchronized void onRecipesFiltered(ArrayList<Recipe> filteredRecipes)
{
MyPagerAdapter myPagerAdapter = (MyPagerAdapter) mMyViewPager.getAdapter();
FilteredRecipesFragment filteredRecipesFragment = (FilteredRecipesFragment)
myPagerAdapter.getRegisteredFragment(PagerConstants.PAGE_FILTER_RECIPES);

if (filteredRecipesFragment == null)
{
// Fragments that has not yet been instantiated will be returned as null. Cannot do anything about it.
// Should be fairly unlikely. See:
// https://stackoverflow.com/a/15261142/1139324
return;
}

FilteredRecipesListFragment listFragment = (FilteredRecipesListFragment)
filteredRecipesFragment.getChildFragmentManager().findFragmentById(R.id.mm_filtered_recipes_list_fragment);
listFragment.onRecipesFiltered(filteredRecipes);
}

关于Android:升级支持库后使用 findFragmentById() 出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com