【问题标题】:Actionmode background issue on fragments片段上的动作模式背景问题
【发布时间】:2025-12-22 03:15:11
【问题描述】:

我正在使用 3 个片段,带有一个选项卡布局和一个工具栏,并且在每个片段上都可以选择一个项目来显示一个动作模式。每个片段都有不同的样式,带有不同颜色但没有效果的“ActionModeBackground”。 我的问题是,一旦我在片段上打开我的动作模式,它将采用正确的颜色,但是一旦通过更改片段然后打开另一个片段来关闭此动作模式,动作模式将具有与以前相同的颜色,而我希望它根据片段而改变。附上一张图片 感谢您的帮助

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>

我在 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) {

        }
    });

每个 fragment 都有自己的 ActionMode.Callback 在我的类中实现一个类:

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

}

【问题讨论】:

    标签: java android android-fragments contextual-action-bar android-actionmode


    【解决方案1】:

    解决了将 ActionMode 背景颜色设置为透明的问题!

    【讨论】: