BottomNavigationView из другого действия

#android #android-activity #fragment #bottomnavigationview

#Android #android-действие #фрагмент #bottomnavigationview

Вопрос:

У меня есть MainActivity, который содержит фрагменты (например, 3 фрагмента), и я могу выбрать фрагмент с помощью BottomNavigationView.

Также у меня есть кнопка в OneFragment, которая запускает SecondActivity (которая также содержит BottomNagigationView).

введите описание изображения здесь

Мой вопрос: Когда во SecondActivity я выбираю bottomNV ItemId two, мне нужно вернуться к 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;
    }
};
}
  

Комментарии:

1. Итак, что вы хотите, если вы вернетесь к основному действию, вы хотите правильно выбрать первую вкладку?

2. @MD нет, мне нужно выбрать вторую вкладку

3. Просто запустите действие с помощью startActivityAsResult (...) from fragment и перехватите действие в основном действии

4. @MD Я пытался, но не работает. Моя основная активность имеет атрибут launchmode = singletask. Зависит ли это от этого?

Ответ №1:

Я видел в вашем коде, что второе действие называется SecondaActivity вместо SecondActivity. Я предположил, что это ошибка в написании, и мой код отражает последнюю.

Вы можете запустить второе действие, используя (someRequestCode — это просто случайный int, который вы можете выбрать):

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

Затем во втором действии вы можете вернуть OK в случае 2 и 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
        }
    }
}
  

Комментарии:

1. извините, это была опечатка. Это SecondActivity

2. Не могли бы вы рассказать немного больше? В чем дело, что это не работает? Что этот код делает с вами?

3. Он возвращает фрагмент MainActicity , который

4. Попробуйте удалить вложенные ifs в onActivityResult. Только вызов selectFrament и проверка, работает ли он.

5. Это работает, если вставить код в 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();
}
  

Комментарии:

1. Я думаю, что было бы лучше завершить второе действие результатом и получить этот результат в MainActiviy. Нет необходимости снова запускать MainActivity.

2. Я думал, что это его смутит

3. Это может сбить его с толку, я согласен, но, на мой взгляд, получение дополнительных функций в onCreate может привести к путанице, если он не используется для воссоздания действий, обработки поворотов и так далее…

4. @MiguelIsla да, действие не воссоздается