【问题标题】:Android Activity: Handle Intent after onCreate()?Android Activity:在 onCreate() 之后处理 Intent?
【发布时间】: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


【解决方案1】:

您应该能够在初始化其他对象之前从您的意图中提取值。从目前的情况来看,您正在尝试填充没有数据的视图,然后稍后分配数据。要解决这个问题,您可以更好地处理适配器中的空值,或者移动您的数据分配。我可能会做后者。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foods);

// Added this.  Moved part of handleOpenIntent() here, other half is below view init.
    String searchQuery = "";
    Intent intent = getIntent();
    if (intent != null) {
        int navigationPosition = intent.getExtras().getInt("NavigationPosition");
        searchQuery = intent.getExtras().getString("SearchQuery");
    //should probably have some error handling if the SearchQuery is missing or the value is invalid.
    }
// End of additions

    //Init some views
    _viewPager = findViewById(R.id.viewpager_foods);
    _foodsPagerAdapter = new FoodsPagerAdapter(getSupportFragmentManager(), this);
    _viewPager.setAdapter(_foodsPagerAdapter);

// added this too, moved out of handleOpenIntent()
    _viewPager.setCurrentItem(navigationPosition);
    _foodsPagerAdapter.performSearch(searchQuery);
// end of additions

//removed
    //handleOpenIntent();
    //do more stuff (show ads etc.)
    Log.i("FoodActivityTest", "onCreate finished");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多