Search code examples
androidandroid-activityfragmentbottomnavigationview

BottomNavigationView from another Activity


I have MainActivity which contains fragments (for example 3 fragments) and I can select fragment by BottomNavigationView.

Also i have button in OneFragment which start SecondActivity (which also contains BottomNagigationView).

enter image description here

My question: When in SecondActivity i select bottomNV itemId two, I need to back to MainActivity with selected TwoFragment.

enter image description here

enter image description here

How can i realize it?

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;
    }
};
}

Solution

  • I have seen in your code that the second activity is called SecondaActivity instead of SecondActivity. I supposed it is being misspelled and my code reflects the last one.

    You can start the second activity using (someRequestCode is just a random int you can choose):

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

    Then in your second activity you can return OK in case 2 and KO in other cases (just for simplicity. If you want to elaborate a bit more you response, you can add some extra):

    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;
    

    And finally in your MainActivity, override onActivityResult (someRequestCode is the same value as stated before):

    @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
            }
        }
    }