Actionmode background issue on fragments

114 Views Asked by At

I am using 3 fragments with a tablayout and a toolbar and on each fragment it is possible to select an item to display an action mode. Each fragment has a different style with an "ActionModeBackground" of different color but without effects. My problem is that, once I open my action mode on a fragment, it will take the correct color, however once this action mode is closed by changing fragments and then opening on another fragment, the action mode will have the same color as before whereas I would like it to change depending on the fragment. Attached an image Thanks for your help

styles.xml

<!--    Fragment 1 Theme-->
<style name="AppTheme1" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/bleuEnCours</item>
    <item name="colorPrimaryDark">@color/bleuEnCours</item>
    <item name="colorAccent">@color/bleuEnCours</item>
    <item name="android:colorEdgeEffect">@color/bleuEnCours</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="actionModeBackground">@color/bleuEnCours</item>
    <item name="checkboxStyle">@style/Widget.AppCompat.CompoundButton.CheckBox</item>
    <item name="colorError">@color/error</item>
    <item name="actionModeCloseDrawable">@drawable/action_mode_cancel</item>
</style>

<!--    Fragment 2 Theme-->
<style name="AppTheme2" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/vertTermine</item>
    <item name="colorPrimaryDark">@color/vertTermine</item>
    <item name="colorAccent">@color/vertTermine</item>
    <item name="android:colorEdgeEffect">@color/vertTermine</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="actionModeBackground">@color/vertTermine</item>
    <item name="tabSelectedTextColor">@color/vertTermine</item>
    <item name="checkboxStyle">@style/Widget.AppCompat.CompoundButton.CheckBox</item>
    <item name="colorError">@color/error</item>
    <item name="actionModeCloseDrawable">@drawable/action_mode_cancel</item>
</style>

I Force the style in the MainActivity.java:

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

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    viewPager2 = findViewById(R.id.viewpager_id);
    setupViewPager(toolbar);

    tabLayout = findViewById(R.id.tablayout_id);
    new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> tab.setText(listTitles.get(position))).attach();
    
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager2.setCurrentItem(tab.getPosition(), true);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                if (tab.getPosition() == 0){
                    toolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.bleuEnCours));
                    tabLayout.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.bleuEnCours));
                    getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, R.color.bleuEnCours));
                    getTheme().applyStyle(R.style.AppTheme1, true);

                } else if (tab.getPosition() == 1){
                    toolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.vertTermine));
                    tabLayout.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.vertTermine));
                    getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, R.color.vertTermine));
                    getTheme().applyStyle(R.style.AppTheme2, true);
                } else {
                    toolbar.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.rougeARenvoyer));
                    tabLayout.setBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.rougeARenvoyer));
                    getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, R.color.rougeARenvoyer));
                    getTheme().applyStyle(R.style.AppTheme3, true);
                }
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

Each fragment has its own ActionMode.Callback implemented in my class a class:

Toolbar_ActionMode_Callback_En_Cours.java:

public abstract class Toolbar_ActionMode_Callback_En_Cours implements ActionMode.Callback {
private ActionMode actionMode;
private MenuItem editItem;
private MenuItem deleteItem;
private MenuItem shareItem;
private MenuItem moveto;


@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mode.getMenuInflater().inflate(R.menu.menu_select_en_cours, menu);
    this.actionMode = mode;
    this.editItem = menu.findItem(R.id.action_edit_product);
    this.shareItem = menu.findItem(R.id.action_share_product);
    this.deleteItem = menu.findItem(R.id.action_delete_products);
    this.moveto = menu.findItem(R.id.action_move_product_to_a_renvoyer);
    return true;
}

@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
    return false;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

@Override
public void onDestroyActionMode(ActionMode mode) {
    actionMode = null;
}

public void setCount(String checkedCount) {
    actionMode.setTitle(checkedCount);
}


public void changeEditItemVisible(boolean b){
    editItem.setVisible(b);
}

public void changeMoveToVisible(boolean b){
    moveto.setVisible(b);
}

public void changeShareItemVisible(boolean b){
    shareItem.setVisible(b);
}

public ActionMode getActionMode() {
    return actionMode;
}

}

Toolbar_ActionMode_Callback_Termine.java:

public abstract class Toolbar_ActionMode_Callback_Termine implements ActionMode.Callback {
private ActionMode actionMode;
private MenuItem editItem;
private MenuItem deleteItem;
private MenuItem moveto;
private MenuItem shareItem;


@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mode.getMenuInflater().inflate(R.menu.menu_select_termine, menu);
    this.actionMode = mode;
    this.editItem = menu.findItem(R.id.action_edit_product);
    this.deleteItem = menu.findItem(R.id.action_delete_products);
    this.moveto = menu.findItem(R.id.action_move_product_to_en_cours);
    this.shareItem = menu.findItem(R.id.action_share_product);
    return true;
}

@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
    return false;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

@Override
public void onDestroyActionMode(ActionMode mode) {
    actionMode = null;
}



public void setCount(String checkedCount) {
    actionMode.setTitle(checkedCount);
}

public void changeEditItemVisible(boolean b){
    editItem.setVisible(b);
}

public void changeMoveToVisible(boolean b){
    moveto.setVisible(b);
}

public void changeShareItemVisible(boolean b){
    shareItem.setVisible(b);
}

public ActionMode getActionMode() {
    return actionMode;
}

}

1

There are 1 best solutions below

0
On

Resolved putting ActionMode background color to Transparent !