我目前正在开发一款需要自定义对话框片段的应用。该对话框由两个元素组成,一个消息和一个图像或一个循环进度条视图。对于image / progressbar,我使用linearlayout作为容器,我希望保留对运行时的引用并动态添加图像/进度条视图。
问题:我可以找到对textview的引用,但是当我尝试获取对内部linearlayout的引用时,它返回null。我也尝试过膨胀父布局并保留对rootview的引用,然后尝试rootview.findViewById()但没有成功。
奇怪:我很容易找到对内部TextView的引用,只有linearlayout返回null。
真的很感激对这个问题的一些指导,看起来很简单,但对于我的生活,我无法弄清楚为什么它会返回null。我已经发布了以下代码。
package com.app.devicetest.dialogs;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.app.devicetest.R;
public class CustomDialog extends Dialog implements View.OnClickListener {
public final static int STYLE_SUCCESS = 1;
public final static int STYLE_FAILURE = 2;
public final static int STYLE_PROGRESS = 3;
private String message;
private TextView dialogMessage;
private LinearLayout dialogImageLayout;
// private LinearLayout rootView;
private Context mContext;
public CustomDialog(Context context) {
super(context);
mContext = context;
}
public CustomDialog(Context context, int theme) {
super(context, theme);
mContext = context;
}
protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// NOTE: I have also tried using this method with rootView.findViewById but the inner linearlayout still returns null.
// LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// rootView = (LinearLayout) inflater.inflate(R.layout.dialog_custom, null);
setContentView(R.layout.dialog_custom);
dialogMessage = (TextView) findViewById(R.id.dialogMessage);
dialogMessage.setText(message);
dialogImageLayout = (LinearLayout) findViewById(R.id.dialogImageLayout);
setCancelable(true);
setCanceledOnTouchOutside(true);
}
public void setDialogMessage(String msg) {
message = msg;
}
public void dialogStyle(int style) {
// Note: Always returns null here.
Log.i("dialog", "dialog reference : " + ((dialogImageLayout == null) ? "null" : "not null"));
if(style == STYLE_SUCCESS) {
}
else if(style == STYLE_FAILURE) {
}
else if(style == STYLE_PROGRESS) {
}
}
}
下面是布局文件:dialog_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_dialog_layout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/container_dropshadow">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/dialogImageLayout">
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="22sp"
android:id="@+id/dialogMessage" />
</LinearLayout>
调用对话框的代码:
completeDialog = new CustomDialog(mContext, R.style.Theme_CustomDialog);
completeDialog.dialogStyle(CustomDialog.STYLE_SUCCESS);
completeDialog.setDialogMessage("Operation successfully completed.");
completeDialog.show();
答案 0 :(得分:0)
我认为值得一提的是我如何为遇到此错误的人克服这个问题。
经过一番研究后,我发现了这种情况发生的原因。似乎方法dialogStyle()在内部视图有机会膨胀之前被调用(可能是因为与TextView相比,它需要更长的时间来膨胀视图)。如果你在dialogImageLayout上的onCreateView上做日志打印,你会注意到引用是非NULL。
因此,当用户调用dialogStyle()并在对话框类中添加视图时,如果您知道视图已正确膨胀并且您有对它的引用,则最好将引用变量保存到类中的当前样式。 / p>