Android DialogFragment内部LinearLayout返回null

时间:2014-05-23 14:09:09

标签: android android-linearlayout android-dialogfragment

我目前正在开发一款需要自定义对话框片段的应用。该对话框由两个元素组成,一个消息和一个图像或一个循环进度条视图。对于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();

1 个答案:

答案 0 :(得分:0)

我认为值得一提的是我如何为遇到此错误的人克服这个问题。

经过一番研究后,我发现了这种情况发生的原因。似乎方法dialogStyle()在内部视图有机会膨胀之前被调用(可能是因为与TextView相比,它需要更长的时间来膨胀视图)。如果你在dialogImageLayout上的onCreateView上做日志打印,你会注意到引用是非NULL。

因此,当用户调用dialogStyle()并在对话框类中添加视图时,如果您知道视图已正确膨胀并且您有对它的引用,则最好将引用变量保存到类中的当前样式。 / p>