【问题标题】:how to set selected fragment when going back to the parent activity?返回父活动时如何设置选定的片段?
【发布时间】:2019-09-20 08:27:10
【问题描述】:

我有 2 项活动:家庭活动和药物详情活动。医学细节活动是家庭活动的孩子

AndroidManifest

<activity android:name=".MedicineDetailActivity"
    android:label="Medicine Detail"
    android:parentActivityName=".HomeActivity" />
<activity
    android:name=".HomeActivity"
    android:label="HOME PAGE"
    android:theme="@style/AppTheme.NoActionBar" />

Home Activity 有一个抽屉,其中一个菜单称为药物列表,它打开药物列表片段。内部药物列表片段是一个列表视图,显示药物列表。如果点击了医学,它将打开医学详细活动。

所以基本上,我想要的顺序是这样的:

  1. 在首页活动中,点击菜单打开抽屉
  2. 在抽屉中,点击“药品列表”菜单,将打开包含药品列表的药品列表片段。
  3. 点击其中一种药物,会打开Medicine Detail Activity,显示所选药物的信息
  4. 单击后退箭头按钮,它(应该)返回首页活动并打开并选择药物列表片段。

当我单击箭头按钮时,我一直卡在第 4 步,它返回到 Home Activity 并打开 home 片段,因为它是默认设置。我尝试了这些但仍然无法正常工作:

MedicineDetailActivity

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();

    Intent data = new Intent();
    data.putExtra("fragment", "med_list_fragment");
    setResult(RESULT_OK, data);
    finish();

}

HomeActivity

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

    Intent intent = getIntent();
    fragmentName = intent.getExtras().getString("fragment");

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    if (savedInstanceState == null{
        if (fragmentName != null) {
            //open fragment by fragmentName
        }
        else {    

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();

            navigationView.setCheckedItem(R.id.nav_home);
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.e("Is it in?", "In here");
}

单击后退箭头按钮时,我打算传递名为 fragment_name 的数据,因此当我在 Home Activity 中获取它时,它将打开药物列表片段而不是默认的主片段。不幸的是,我要获取数据的这一行将返回错误:

fragmentName = intent.getExtras().getString("fragment");

另外,我尝试使用 onActivityResult 据说是在活动打开时执行(在这种情况下,当医学详细信息活动关闭后重新打开主页活动时)。但它根本没有被执行:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.e("Is it in?", "In here");
}

在子活动关闭后,如何让父活动默认打开某个片段?请帮忙。

【问题讨论】:

  • 你想通过设置结果并完成onBackPressed中的活动来实现什么?还向我们展示您如何导航到其他活动的代码。
  • @Isak 我编辑了它,希望它更清晰

标签: android android-fragments


【解决方案1】:

这两个活动是不同的。您可以通过使用startActivityForResult() 接收onActivityResult() 回调来实现此目的。但是你应该修改你的第 3 点和第 4 点:

  1. 点击其中一种药物,会打开Medicine Detail Activity,显示所选药物的信息。
  2. 单击后退箭头按钮,它会返回主活动。

基本上将您的应用设置为不干扰任务堆栈和后台堆栈。如果您在没有调用finish() 或任何其他片段事务的情况下离开活动,活动将管理此状态并保持原样。

如果不保持状态,不是你做的不够,而是你不应该做的太多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多