view.findViewById(....)始终在对话框中返回null

时间:2014-04-16 09:41:47

标签: android dialog alertdialog

我有一个对话框,我希望强制用户在EditText中填写一个名称,如果它是空的我希望按下完成无效。但是,

EditText x = (EditText) view.findViewById(R.id.name);

始终返回null。我尝试过搜索,但只找到了解决方案,为findViewById(...)添加了一个视图,但我已经有了。我猜它与我创建自己的按钮版本有关。

这是Dialog的代码。

package com.example.dialogruta;


@SuppressLint({ "NewApi", "ValidFragment" })
public class RecordDialog extends DialogFragment {


public  Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    final View view = inflater.inflate(R.layout.record_fragment, null);
    builder.setView(view).setPositiveButton("Save experiment", null); //Creating my own 

    final Dialog d = builder.create();
    d.setOnShowListener(new DialogInterface.OnShowListener() {

        @Override
        public void onShow(DialogInterface dialog) {

            Button b = ((AlertDialog) d).getButton(AlertDialog.BUTTON_POSITIVE);
            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    EditText x = (EditText) view.findViewById(R.id.name);
                    if( x!= null && !x.toString().isEmpty()){
                        String xs = x.getText().toString();
                        d.dismiss();
                    }
                    else{
                        //TODO: Stuff
                    }
                }
            });
        }
    });

    return d;
}


}

这是.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >


        <EditText
    android:id="@+id/name"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"
    android:hint="Experiment name" />

        <EditText
    android:id="@+id/notes"
    android:inputType="textMultiLine"
    android:layout_width="match_parent"
    android:layout_height="200dip"
    android:layout_weight ="1"
    android:lines="5"
    android:minLines="1"
    android:gravity="top|left"
    android:maxLines="10"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"
    android:hint="Notes" />

 </LinearLayout>

4 个答案:

答案 0 :(得分:1)

更改此

public void onClick(View view) {

public void onClick(View v) {

你有

final View view = inflater.inflate(R.layout.record_fragment, null);

和这个

public void onClick(View view) {

View view

这里发生了什么

 @Override
 public void onClick(View view) {
 EditText x = (EditText) view.findViewById(R.id.name);

EditText不是按钮的子节点,view.findViewById在当前视图层次结构中查找视图。它应该在膨胀的布局final View view = inflater.inflate(R.layout.record_fragment, null);

中查找视图

答案 1 :(得分:1)

试试这个..

更改视图名称

final View main_view = inflater.inflate(R.layout.record_fragment, null);
builder.setView(main_view).setPositiveButton("Save experiment", null);

并使用它

EditText x = (EditText) main_view.findViewById(R.id.name);

因为在public void onClick(View view) { onclick中有view编辑文字需要引用inflated视图。不是onclick视图。

就像@Raghunandan所说改变onclick view名称为public void onClick(View v) {

答案 2 :(得分:0)

在onClick()方法中更改本地视图名称。

public void onClick(View v)

答案 3 :(得分:0)

在onCreate方法的开头将变量声明为私有,并在那里访问。

EditText x = (EditText) findViewById(R.id.name);

现在,您将在onClick()方法中获得x的值。