我有一个单击按钮后打开的对话框。对话框内部包含多个按钮,但为了简单起见,我只关注“太阳”按钮。该按钮的理想结果是,如果按下该按钮,“Sun”的文本颜色将变成绿色,然后如果再次按下该按钮,它将变回正常的白色文本颜色。 此图是对话框
下面列出了上下文的源代码。
按钮属性 XML
<Button
android:id="@+id/sunday_btn"
android:layout_width="90sp"
android:layout_height="90sp"
android:layout_gravity="top|left"
android:background="@drawable/roundstyle_darkgray"
android:fontFamily="@font/inria_sans_bold"
android:text="Sun"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="30sp"
android:onClick="sundayToggle"/>
颜色.xml
\<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="lightGray">#D9D9D9</color>
<color name="darkGray">#404040</color>
<color name="darkerGray">#141414</color>
<color name="selectedGreen">#57E44B</color>
</resources>
RateList.java
public class RateList extends AppCompatActivity {
private boolean bool_editMode = false;
private final boolean[] popup_selectedWdBool = {false,false,false,false,false,false,false};
Dialog dialog;
Button btnDialogSave, btnDialogCancel, sundayBTN;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_rate_list);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
((Button)findViewById(R.id.add_constant_btn)).setVisibility(View.INVISIBLE);
dialog = new Dialog(RateList.this);
dialog.setContentView(R.layout.add_constant_popup);
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.setCancelable(false);
btnDialogCancel = (Button)findViewById(R.id.cancel_button);
btnDialogSave = (Button)findViewById(R.id.save_button);
sundayBTN = (Button)findViewById(R.id.sunday_btn);
}
public void onClickSave(View view) {
dialog.dismiss();
Toast.makeText(RateList.this, "Saved", Toast.LENGTH_SHORT).show();
// SAVE INFO TO CSV
}
public void onClickCancel(View view) {
dialog.dismiss();
Toast.makeText(RateList.this, "Cancelled", Toast.LENGTH_SHORT).show();
}
public void sundayToggle(View view) {
if (!popup_selectedWdBool[0]){
Toast.makeText(RateList.this, "Sunday Selected", Toast.LENGTH_SHORT).show();
sundayBTN.setTextColor(Color.parseColor("#57E44B"));
}else{
Toast.makeText(RateList.this, "Sunday Deselected", Toast.LENGTH_SHORT).show();
sundayBTN.setTextColor(Color.parseColor("#FFFFFF"));
}
popup_selectedWdBool[0] = !popup_selectedWdBool[0];
}
}
根据提供的代码,这就是我的问题所在。在
sundayToggle()
下,有一个 if-else 语句,用于处理按钮的选定部分和未选定部分。除了这些行之外,所有这些都有效:sundayBTN.setTextColor(Color.parseColor("#57E44B"));
和sundayBTN.setTextColor(Color.parseColor("#FFFFFF"));
。我通过注释掉这两行来测试它们,这使得程序可以工作并且 Toast
也可以工作。但如果我取消注释它们,当我按下它时,不仅仅是对话框,整个活动都会崩溃。我现在想知道我做错了什么,因为到这一部分一切都很顺利。我的保存和取消适用于其他上下文。
我直接使用了
(Button)findViewById(R.id.sunday_btn);
,然后将其变成名为sundayBTN
的变量。两个都没用。
没关系,我找到了答案 显然,您必须指定您尝试更改的按钮来自对话框,而不是来自布局本身。
因此:
sundayBTN = (Button)findViewById(R.id.sunday_btn);
我把它变成了这样:
sundayBTN = (Button)dialog.findViewById(R.id.sunday_btn);
这使得整个事情顺利进行!