【发布时间】:2021-01-10 18:41:51
【问题描述】:
我的 Android Activity 的初始化顺序有问题。
基础知识:
Activity 包含一个 ViewPager,其中包含 3 个 Fragment。 Activity 以这种方式打开:
Intent foodsActivityIntent = new Intent(getActivity(), FoodsActivity.class);
foodsActivityIntent.putExtra("NavigationPosition", navigationPosition);
foodsActivityIntent.putExtra("SearchQuery", searchQuery);
foodsActivityIntent.putExtra("SelectedDateMillis", _currentDay.toDate().getTime());
startActivityForResult(foodsActivityIntent, 200);
在 onCreate - 方法中,我捕获了 Intent 并做一些事情:
Intent intent = getIntent();
if (intent != null) {
//Some stuff
_foodsPagerAdapter.performSearch();
}
这里有趣的部分是“_foodsPagerAdapter.performSearch()”。有了这个我想在每个片段中执行搜索。
public void performSearch() {
if (_foodSearchFragment != null)
_foodSearchFragment.performSearch();
if (_foodFavoritesFragment != null)
_foodFavoritesFragment.performSearch();
if (_foodCustomFragment != null)
_foodCustomFragment.performSearch();
}
问题:
如你所见,每个 Fragment 中的搜索方法只有在 Fragment 不为 null 时才会被调用。我的问题是在 onCreate(和 onStart)方法完成后调用 getItem() - 方法(初始化适配器中的片段)。因此永远不会调用每个片段的 performSearch - 方法。
您可以通过这个 Logcat 输出更好地理解这一点:
首先调用 performSearch,然后调用 getItem()。但是必须首先调用 getItem 才能使我的代码正常工作。
getItem():
@Override
public Fragment getItem(int i) {
Log.i("FoodActivityTest", "call getItem in FragmentPagerAdapter");
Fragment fragment = null;
switch (i) {
case 0:
if (_foodSearchFragment == null)
_foodSearchFragment = new FoodSearchFragment();
fragment = _foodSearchFragment;
break;
case 1:
if (_foodFavoritesFragment == null)
_foodFavoritesFragment = new FoodFavoritesFragment();
fragment = _foodFavoritesFragment;
break;
case 2:
if (_foodCustomFragment == null)
_foodCustomFragment = new FoodCustomFragment();
fragment = _foodCustomFragment;
break;
}
return fragment;
}
我做错了什么?我需要以不同的方式解决问题吗?
编辑 1:
食物活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_foods);
//Init some views
_viewPager = findViewById(R.id.viewpager_foods);
_foodsPagerAdapter = new FoodsPagerAdapter(getSupportFragmentManager(), this);
_viewPager.setAdapter(_foodsPagerAdapter);
handleOpenIntent();
//do more stuff (show ads etc.)
Log.i("FoodActivityTest", "onCreate finished");
}
@Override
protected void onStart() {
super.onStart();
Log.i("FoodActivityTest", "onStart finished");
}
private void handleOpenIntent() {
Intent intent = getIntent();
if (intent != null) {
int navigationPosition = intent.getExtras().getInt("NavigationPosition");
String searchQuery = intent.getExtras().getString("SearchQuery");
_viewPager.setCurrentItem(navigationPosition);
_foodsPagerAdapter.performSearch(searchQuery);
}
}
编辑 2:
FoodsPagerAdapter:
public class FoodsPagerAdapter extends FragmentPagerAdapter {
private Context _context;
private FoodSearchFragment _foodSearchFragment;
private FoodFavoritesFragment _foodFavoritesFragment;
private FoodCustomFragment _foodCustomFragment;
public FoodsPagerAdapter(FragmentManager fm, Context context) {
super(fm);
_context = context;
}
@Override
public Fragment getItem(int i) {
Log.i("FoodActivityTest", "call getItem in FragmentPagerAdapter");
Fragment fragment = null;
switch (i) {
case 0:
if (_foodSearchFragment == null)
_foodSearchFragment = new FoodSearchFragment();
fragment = _foodSearchFragment;
break;
case 1:
if (_foodFavoritesFragment == null)
_foodFavoritesFragment = new FoodFavoritesFragment();
fragment = _foodFavoritesFragment;
break;
case 2:
if (_foodCustomFragment == null)
_foodCustomFragment = new FoodCustomFragment();
fragment = _foodCustomFragment;
break;
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return _context.getString(R.string.activity_foods_search);
case 1:
return _context.getString(R.string.activity_foods_favorites);
case 2:
return _context.getString(R.string.activity_foods_customfood);
default:
return "Error";
}
}
public void performSearch(String query) {
Log.i("FoodActivityTest", "call performSearch");
if (_foodSearchFragment != null)
_foodSearchFragment.performSearch(query);
if (_foodFavoritesFragment != null)
_foodFavoritesFragment.performSearch(query);
if (_foodCustomFragment != null)
_foodCustomFragment.performSearch(query);
}
【问题讨论】:
-
你能提供你的整个 FoodActivity.class 吗?
-
我已经以简化的形式添加了它。所以我认为是相关的。
-
我想我找到了解决方案。但不知道这是否是一个好的解决方案。感觉很脏,但似乎有效:_viewPager.postDelayed(new Runnable() { @Override public void run() { _foodsPagerAdapter.performSearch(searchQuery); } }, 500);
-
了解问题所需的
adapter的完整代码 -
我已经添加了适配器代码
标签: java android android-fragments android-activity