为什么我的文字变灰了?可能上下文与某些事情有关

Why my text is getting greyed-out? Probably Context has to do with something

所以我的 AlertDialog 的 Negative 和 Positive 按钮是灰色的,但它们不应该是。 greyed-out text screen

我怀疑它与上下文有关,因为有一次我的 ListView 遇到了同样的问题。我已通过将 ArrayAdapter 引用中的参数从 getApplicationContext() 更改为 getBaseContext() 来修复该问题。有人可以向我解释吗?我不太明白 'Context'

这是我的代码

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();

Context 是 android 中的一个有趣话题。需要了解的一件事是 Application Context 和 Activity Context 是不同的。您应该确保与 UI 相关的任何内容都应该使用 Activity 上下文。

这可以是

  • 显示对话框
  • 开始另一个activity
  • 膨胀新布局

    这是因为 Activity 是清单中定义的主题实际附加到的唯一上下文。

我也推荐Context, What Context篇文章看全图

快乐编码:)

首先,如果那段代码在 activity 中,您可以简单地用“this”声明上下文(这是您通过将 MainActivity.this) 传递给对话框生成器。

我怀疑 可能 您的 MainActivity 正在为 AlertDialog 设置主题,这使得按钮看起来是灰色的。您可以在 styles.xml(如果为对话框定义了样式)和 AndroidManifest 文件中检查您要传递给 MainActivity 的主题。

如果您没有找到任何东西wrong/don不想更改主题,我可以想到两种解决该问题的方法

第一种方式——改变按钮颜色(工作量少,但不够灵活)

第一个实际上是将对话框按钮颜色更改为您想要的任何颜色,就像在 中所做的那样。

第二种方式 - 扩充满足您需要的自定义视图(更多工作,但更灵活)

第二种方法是膨胀视图并将其传递给对话框。实际上,您根本不必使用标准对话框样式,您可以在其中扩充自己的视图以满足您的需要。

为此,您必须:

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 在您的代码中引用它们)。

第二种方式最大的好处就是可以随心所欲地充气,随心所欲地充气。如果你愿意,你甚至可以在里面放图片。

希望对您有所帮助,如果对您有用,请告诉我。