我尝试获取消息,以下代码行有效:
TextView dialogMessage = (TextView)dialogObject.findViewById(android.R.id.message);
但是当我尝试使用以下行获取标题时,它会返回
null
TextView dialogTitle = (TextView)dialogObject.findViewById(android.R.id.tittle);
我检查了
AlertDialog
的代码。在内部,他们使用 R.id.alertTitle
来初始化 AlertDialog
标题的 TextView
。您可以使用 getIdentifier
来检索它:
int titleId = getResources().getIdentifier( "alertTitle", "id", "android" );
if (titleId > 0) {
TextView dialogTitle = (TextView) dialogObject.findViewById(titleId);
if (dialogTitle != null) {
}
}
编辑:对于
AppCompat
,getIdentifier
的第三个参数应该是您的应用程序的包名称。您可以使用 context.getPackageName()
检索后者
为了避免代码被破坏,当Google决定将来更改其对话框标题视图ID时,这里有更可靠的解决方案。
我们将简单地返回第一个遇到的
View
,其类型为TextView
。
//
// Usage: findFirstEncounteredType(getDialog().getWindow().getDecorView(), TextView.class)
//
public static View findFirstEncounteredType(View view, Class<? extends View> klass) {
if (klass.isInstance(view)) {
return view;
} else {
if (!(view instanceof ViewGroup)) {
return null;
}
}
ViewGroup viewGroup = (ViewGroup)view;
for (int i=0, ei=viewGroup.getChildCount(); i<ei; i++) {
View child = viewGroup.getChildAt(i);
View result = findFirstEncounteredType(child, klass);
if (result != null) {
return result;
}
}
return null;
}
我知道这个问题提到了 AlertDialog,但如果您通过 Google 搜索来到这里并寻找
DialogFragment
的答案:
getDialog().findViewById(android.R.id.title))
您可以自己实现。创建您自己的扩展 android.app.AlertDialog.Builder 的类。然后使用 setTitle() 方法后创建一个变量来存储您的值。
import android.content.Context;
import android.support.annotation.StringRes;
public class AlertDialog extends android.app.AlertDialog.Builder {
private Context context;
private String title;
public AlertDialog(Context context) {
super(context);
this.context = context;
}
public AlertDialog(Context context, int themeResId) {
super(context, themeResId);
this.context = context;
}
/**
* Set title using string
*/
@Override
public AlertDialog setTitle(CharSequence title) {
// set the title
this.title = title.toString();
super.setTitle(title);
return this;
}
/**
* Set title using resource string
*/
@Override
public AlertDialog setTitle(@StringRes int titleId) {
this.title = this.context.getText(titleId).toString();
super.setTitle(titleId);
return this;
}
// create public method
public String getTitle(){
return this.title;
}
}
然后使用你可以像普通的AlertDialog一样使用它,并实现获取其标题的方法。然后你就可以测试一下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Crete new alert dialog
AlertDialog dialog = new AlertDialog(this);
dialog.setMessage("Type some message here :D");
dialog.setTitle(R.string.settings_title); // string resource
dialog.setTitle("Dialog1 title"); // string
dialog.show();
// Crete secondary dialog with same title
// using getTitle() method
new AlertDialog(this)
.setTitle(dialog.getTitle())
.setMessage("Copy title from first dialog.")
.show();
}
}
在尝试了多个答案以及使用和不使用
AppCompat
来检索对话框标题的方法之后,以下是如何执行此操作的摘要:
如果您正在使用
androidx.appcompat.app.AlertDialog
:
dialog.findViewById<TextView>(androidx.appcompat.R.id.alertTitle)?.let {
// Do whatever you want with the title
}
如果您正在使用
android.app.AlertDialog
:
val titleId: Int = context.resources.getIdentifier("alertTitle", "id", "android")
if (titleId > 0) {
dialog.findViewById<TextView>(titleId)?.let {
// Do whatever you want with the title
}
}
确保调用此代码after
dialog.show()
!
我知道这是一篇旧帖子,但我使用了已接受的答案并添加了其他对我有用的内容。您可以使用下面的代码将对话框标题设为多行(默认 1 行)。我还读出了预设标题,因为我后来使用ContentLoaders异步添加了txt
int titleId = getResources().getIdentifier( "alertTitle", "id", "android" );
if (titleId > 0) {
TextView dialogTitle = (TextView) getDialog().findViewById(titleId);
if (dialogTitle != null) {
dialogTitle.setMaxLines(4);
dialogTitle.setSingleLine(false);
String txt = dialogTitle.getText().toString();
String txt1 = txt + ":\n\n" + "next line txt";
dialogTitle.setText(txt1);
}
}