因此我的AlertDialog的Negative和Positive按钮是灰色的,但它们不应该是灰色的。 greyed-out text screen
我怀疑它与Context有关,因为一旦我与ListView有相同的问题。我通过将ArrayAdapter的引用中的参数从getApplicationContext()更改为getBaseContext()来修复它。有人可以向我解释一下吗?我真的不明白'上下文'
这是我的代码
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("What do you want to do with " + getArrayList("ListOfRecipes").get(position) );
builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
List<String> list = new ArrayList<>(getArrayList("ListOfRecipes"));
Toast.makeText(getBaseContext(), list.get(position) + "has been removed", Toast.LENGTH_SHORT).show();
list.remove(position);
saveList(list, "ListOfRecipes");
}
});
builder.setNegativeButton("Modify", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
List<String> list = new ArrayList<>(getArrayList("ListOfRecipes"));
SharedPreferences sp = getSharedPreferences("Recip", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("Recip", list.get(position));
editor.apply();
startActivity(new Intent(getBaseContext(), ManageRecipeActivity.class));
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
答案 0 :(得分:0)
Context是android中一个有趣的话题。有一点需要理解,应用程序上下文和活动上下文是不同的。你应该确保任何与UI相关的东西,你应该使用Activity Context。
这可以是
之类的东西充气新布局
这是因为Activity是实际附加清单中定义的主题的唯一上下文。
我还建议使用Context, What Context文章来全面了解。
快乐编码:)
答案 1 :(得分:0)
首先,如果这段代码在一个活动中,你可以简单地用&#34; 这个&#34;来声明上下文。 (这是通过将MainActivity.this传递给对话框构建器而完成的。
我怀疑的是,可能是您的MainActivity正在为AlertDialog获取一个主题,使按钮看起来是灰色的。您可以在styles.xml中检查(如果有为对话框定义的样式),并在AndroidManifest文件中检查您传递给MainActivity的主题。
如果您没有发现任何错误/不想改变主题,我可以想到解决该问题的两种方法。
第一种方式 - 更改按钮颜色(减少工作量,但不太灵活)
第一个实际上是将this post中的对话框按钮颜色更改为您想要的任何颜色。
第二种方式 - 为满足您需求的自定义视图充气(更多工作,但更灵活)
第二种方法是给视图充气并将其传递给对话框。实际上,您根本不必使用标准对话框样式,您可以在其中充气您自己的视图以满足您的需求。
要做到这一点,你必须:
1)对所选视图进行通胀
举个例子:
LayoutInflater factory = LayoutInflater.from(this);
final View view = factory.inflate(R.layout.image_dialog_layout, null);
2)将膨胀的视图传递给对话框构建器:
final AlertDialog dialog = new AlertDialog.Builder(this);
dialog.setView(view);
//Additional code to set click listeners, i.e.
dialog.create().show();
}
这样,你可以膨胀你想要的任何布局,所以你可以把你想要的按钮放在里面(用你想要的颜色,大小,字体类型)。
重要的是要注意,即使在向视图充气后,您仍然可以使用方法setPositiveButton和setNegativeButton,它们将出现在对话框中的膨胀布局下方。因此,请注意按钮和使用这些方法,因为按钮将显示重复。
因为在这种情况下,您不希望它们变成灰色,所以您希望将按钮放在布局中,使用您想要的任何样式,并对它们进行充气(并通过findViewById在代码中引用它们)。
第二种方式的最大优势在于,您可以使用您想要的样式来充气。如果愿意,您甚至可以将图像放入其中。
希望它有所帮助,让我知道它是否适合你。