【问题标题】:BottomNavigationView from another Activity来自另一个 Activity 的 BottomNavigationView
【发布时间】:2019-03-20 12:20:51
【问题描述】:

我有包含片段(例如 3 个片段)的 MainActivity,我可以通过 BottomNavigationView 选择片段。

我还在 OneFragment 中有按钮,它启动 SecondActivity(也包含 BottomNagigationView)。

我的问题:当我在 SecondActivity 中选择 bottomNV itemId 两个时,我需要返回 MainActivity 并选择 TwoFragment。

我怎么能意识到它?

MainActivity.class

public class MainActivity extends AppCompatActivity {

private BottomNavigationView navigationView;
private Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    navigationView = findViewById(R.id.navigationBottom);
    navigationView.setOnNavigationItemSelectedListener(navListelener);
    getSupportFragmentManager().beginTransaction().replace(R.id.content_main,
            new OneFragment()).commit();
}

public BottomNavigationView.OnNavigationItemSelectedListener navListelener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        setTitle(item.getTitle());
        switch (item.getItemId()){
            case R.id.bottom_one:
                selectFragment(new OneFragment());
                break;
            case R.id.bottom_two:
                selectFragment(new TwoFragment());
                break;
            case R.id.bottom_three:
                selectFragment(new ThreeFragment());
                break;

        }
        return true;
    }
};

private void selectFragment(Fragment selectedFragment){
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_main, selectedFragment)
            .commit();
}

}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

private BottomNavigationView navigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_seconda);

    navigationView = findViewById(R.id.navigationBottom);
    navigationView.setOnNavigationItemSelectedListener(navListener);

    Menu menu = navigationView.getMenu();
    MenuItem menuItem = menu.getItem(1);
    menuItem.setChecked(true);
}

private BottomNavigationView.OnNavigationItemSelectedListener navListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.bottom_one:
                finish();
                break;
            case R.id.bottom_two:
                //need to return to MainActivity with selected TwoFragment
                break;
            case R.id.bottom_three:
                break;
        }

        return true;
    }
};
}

【问题讨论】:

  • 那么你想要什么如果你回到主要活动你想选择第一个 Tab 吗?
  • @MD 不,我需要选择第二个标签
  • startActivityAsResult (...) from fragment 的简单启动活动并在主要活动中捕获操作
  • @MD 我试过了,但没用。我的 MainActicity 具有属性 launchmode = singletask。取决于这个吗?

标签: android android-activity fragment bottomnavigationview


【解决方案1】:

我在您的代码中看到第二个活动称为 SecondaActivity 而不是 SecondActivity。我想它拼错了,我的代码反映了最后一个。

您可以使用(someRequestCode 只是您可以选择的随机整数)开始第二个活动:

Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, someRequestCode);

然后在您的第二个活动中,您可以在案例 2 中返回 OK,在其他情况下返回 KO(只是为了简单起见。如果您想详细说明您的响应,您可以添加一些额外的内容):

case R.id.bottom_two:
   //need to return to MainActivity which selected TwoFragment
   Intent data = new Intent();
   data.putExtra("key", "value"); // You can add data if needed. For example, number of fragment to be changed
   setResult(RESULT_OK, data);
   finish();
   break;

最后在您的 MainActivity 中,覆盖 onActivityResult(someRequestCode 与前面所述的值相同):

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someRequestCode) {
        if (resultCode == RESULT_OK) {
            // Here you can get key, value pair from extra and act accordingly
            selectFragment(new TwoFragment());
        } else {
            // Do something else
        }
    }
}

【讨论】:

  • 抱歉,打错了。这是SecondActivity
  • 您能详细说明一下吗?什么是它不工作的东西?这段代码对你有什么作用?
  • 它返回一个 MainActicity fragmentOne
  • 尝试移除onActivityResult中嵌套的ifs。只有调用 selectFrament 并检查它是否有效。
  • 如果在 if (requestCode != REQUEST_CODE) 中插入代码就可以了
【解决方案2】:
case R.id.bottom_two:
            //need to return to MainActivity which selected TwoFragment
   Intent intent = new Intent(SecondaActivity.this,MainActivity.class);
   intent.puExtra("fragment_no",2);
   startActivity(intent);
   finish();
   break;

在 MainActivity 中

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
navigationView = findViewById(R.id.navigationBottom);
navigationView.setOnNavigationItemSelectedListener(navListelener);
Bundle extras = getIntent().getExtras(); 
if(extras!=null)
{   intent number = extras.getInt("fragment_no");
if(number == 2)
getSupportFragmentManager().beginTransaction().replace(R.id.content_main,
        new TwoFragment()).commit();
}
else
getSupportFragmentManager().beginTransaction().replace(R.id.content_main,
        new OneFragment()).commit();
}

【讨论】:

  • 我认为最好用结果完成第二个活动并在 MainActiviy 中获取此结果。无需再次启动 MainActivity。
  • 我认为这会让他感到困惑
  • 这可能会让他感到困惑,我同意,但在我看来,如果他不习惯重新创建活动、处理旋转等,在 onCreate 中获取额外内容可能会导致混乱......
  • @MiguelIsla 是的,没有重新创建活动
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 2014-12-20
相关资源
最近更新 更多