繁体   English   中英

返回父活动时如何设置选定的片段?

[英]how to set selected fragment when going back to the parent activity?

我有 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 片段,因为它是默认设置。 我尝试了这些但仍然无法正常工作:

医学详情活动

@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();

}

家活动

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(在这种情况下,当关闭 Medicine Detail Activity 后重新打开 Home Activity 时)。 但它根本没有被执行:

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

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

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

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

  1. 单击其中一种药物,将打开药物详情活动,显示所选药物的信息。
  2. 单击返回箭头按钮,它只是返回到主活动。

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

如果 state 没有保留,那说明你做得不够,而是你不应该做的太多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM