#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 (...)
fromfragment
и перехватите действие в основном действии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 да, действие не воссоздается