我有一个对话框,我希望强制用户在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>
答案 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的值。