Search code examples
javaandroidandroid-fragmentsfragmentandroid-toolbar

How do I Listen events from the toolbar in fragments?


Im Making an App that consist in One activity with a tablayout and a Viewpager, I have 3 tabs where each tab has a fragment. The main activity has a Toolbar with a Swich on it.

The point is that I need listen events changes from this switch in the main activity and the fragments. Actually I called onCreateOptionsMenu and onOptionItemSelected in MainActivity and works but Is possible use this methods in fragments again? o How can I listen events from UI controls in the toolbar from a fragment?

Mi Code is:

MainActivity.java

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

    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(myToolbar);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);



    if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    }else{
        if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)){
            Toast.makeText(MainActivity.this,"Debes autorizar los permisos de ubicacion",Toast.LENGTH_SHORT).show();
        }else{
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION_REQUEST_CODE);
        }
    }


}

private void setupViewPager(ViewPager viewPager){
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), getString(R.string.tabRedes));
    adapter.addFragment(new TwoFragment(),getString(R.string.tabRedesGuardadas));
    adapter.addFragment(new ThreeFragment(),getString(R.string.tabMapas));
    viewPager.setAdapter(adapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menuactionbar,menu);
    final SwitchCompat switch1= (SwitchCompat) menu.findItem(R.id.switch_wifi).getActionView().findViewById(R.id.switchForActionBar);


    if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        switch1.setChecked(wifiManager.isWifiEnabled());

        if(wifiManager.isWifiEnabled()){
            switch1.setText(R.string.switchOnWifiEs);
        }else {
            switch1.setText(R.string.swtichOffWifiEs);
            //wifiManager.setWifiEnabled(true);
        }

        switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    switch1.setText(R.string.switchOnWifiEs);
                    wifiManager.setWifiEnabled(true);
                    Toast.makeText(MainActivity.this,R.string.switchingOnWifiEs,Toast.LENGTH_SHORT).show();
                }
                else{
                    switch1.setText(R.string.swtichOffWifiEs);
                    wifiManager.setWifiEnabled(false);
                    Toast.makeText(MainActivity.this,R.string.switchingOffWifiEs,Toast.LENGTH_SHORT).show();
                }
            }
        });

    }else{
        if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)){
            Toast.makeText(MainActivity.this,"Debes autorizar los permisos de ubicacion",Toast.LENGTH_SHORT).show();
        }else{
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION_REQUEST_CODE);
        }
    }


    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){

    switch (item.getItemId()){
        case R.id.menu_settings:
            Intent nav = new Intent(MainActivity.this,configuracion_Activity.class);
            startActivity(nav);
            return true;
        case R.id.menu_acercade:
            Intent nav2 = new Intent(MainActivity.this,acercade_Activity.class);
            startActivity(nav2);
            return true;
        default:
            Toast.makeText(MainActivity.this,"Estas entrando en e Default",Toast.LENGTH_SHORT).show();
            return super.onOptionsItemSelected(item);
    }
}

Solution

  • In your CheckedChangeListener of Switch

      switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked){
                            switch1.setText(R.string.switchOnWifiEs);
                            wifiManager.setWifiEnabled(true);
                            Toast.makeText(MainActivity.this,R.string.switchingOnWifiEs,Toast.LENGTH_SHORT).show();                 
                        }
                        else{
                            switch1.setText(R.string.swtichOffWifiEs);
                            wifiManager.setWifiEnabled(false);
                            Toast.makeText(MainActivity.this,R.string.switchingOffWifiEs,Toast.LENGTH_SHORT).show();
                        }
    final Fragment currentFragment = getFragmentManager().findfragmentId(R.id.container);
    if(currentFragment instance HomeFragment){
    ((HomeFragment)currentFragment).switchClicked(isChecked);
    }
    
    
                    }
                });
    

    In your fragment :

    public void switchClicked(final boolean isChecked){
    ...... your code.
    }