FAB on click start new activity 基于当前显示的片段

FAB on click start new activity based on fragment currently shown

我正在尝试找到一种通过单击浮动操作按钮启动 activity 的好方法。 我的 FAB 位于 mainactivity.xml。我的 MainActivity 由带片段的底部导航组成。我需要实施由显示的片段确定的不同点击操作。

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab_add);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    fabClicked();
    }
});

fabClicked 方法

public void fabClicked() {
    Object id = getSupportFragmentManager().findFragmentById(R.id.container);


    if ((getSupportFragmentManager().findFragmentById(R.id.fragment_1)).equals(id)) {
        Intent intent1 = new Intent(MainActivity.this, Add1.class);
        startActivity(intent1);
    }

    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_2)).equals(id)) {
        Intent intent2 = new Intent(MainActivity.this, Add2.class);
        startActivity(intent2);
    }

    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_3)).equals(id)) {
        Intent intent3 = new Intent(MainActivity.this, Add3.class);
        startActivity(intent3);
    }
    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_home)).equals(id)) {
        //plan to add to code to hide fab on homescreen
    }

}

一个简单的解决方案是:

每当使用底部导航时,只需将选定的片段id保存在静态变量中,当用户按下FAB时,只需根据变量中存储的片段打开activity。

你的方法很好,但是它做了很多不必要的昂贵的片段查找。

您可以通过以下方式获取当前 Fragment 的导航 ID:

navController.getCurrentDestination().getId()

然后您可以使用这个返回的 id 在基于 Fragment 的点击监听器中做不同的事情,像这样:

fun fabClicked() {
    val id = navController.getCurrentDestination().getId()
    val class = when(id) {
        R.id.fragment_1 -> Add1::class
        R.id.fragment_2 -> Add2::class
        // etc
    }
    startActivity(Intent(this, class.javaClass))
}

这样就不需要对每个条件都做Fragment查找,只需要简单的比较id即可。您还可以提取共享的 startActivity 逻辑(如此处所示)以使其更加简洁。