【问题标题】:EditText value of custom AlertDialog to Textview自定义 AlertDialog 到 Textview 的 EditText 值
【发布时间】:2016-03-09 23:42:31
【问题描述】:

我在这里发现了一些类似的问题,但是对于像我这样的新手来说,所有这些问题要么真的很困惑,要么无助于解决我的问题: 我有一个 TextView 电视。通过单击它,我想显示一个带有 EditText + Cancel- 和 Update-Buttons 的自定义 AlertDialog。通过单击我的对话框的更新按钮,我想用对话框中的 EditText 的值替换相同 TextView (tv) 的文本。这是我的尝试之一:

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final TextView tv̶̶C̶̶l̶̶i̶̶c̶̶k̶̶e̶̶d̶ = (TextView) findViewById(R.id.tv_id);
    tv.setText("Initial value");

    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            UpdateDialogFragment updDiag = new UpdateDialogFragment();
            updDiag.show(getFragmentManager(), "dialog");
            tv.setText(updDiag.value); // I try to get the value of EditText like this, but it doesn't work
        }
        });
}

public class UpdateDialogFragment extends DialogFragment {
    String value; // I try to get the value of EditText like this, but it doesn't work
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        builder.setView(inflater.inflate(R.layout.edit_tv, null))
                .setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        EditText et = (EditText) UpdateDialogFragment.this.getDialog().findViewById(R.id.et_tv);
                        value = et.getText().toString();  // I try to get the value of EditText like this, but it doesn't work
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        UpdateDialogFragment.this.getDialog().cancel();
                    }
                });
        return builder.create();
    }
}

还有我的edit_tv.xml:

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

    <EditText
        android:id="@+id/et_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="40dp"
        android:hint="Enter text ..."
        android:layout_gravity="center_horizontal">

        <requestFocus />
    </EditText>

</LinearLayout>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yev.tabletasting.MainActivity">

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />    

</RelativeLayout>

在我的情况下,点击“更新”后,电视的文本将设置为“”(可能为空)。 我会感谢你的每一个建议,在期待中感谢你!

【问题讨论】:

  • whats tvclicked 和 tv?他们是两个文本视图吗?无论如何,您要设置文本的textview,全局声明它..并在value = et.getText().toString();之后在setPositiveButton onClick中执行textview.settext(value)
  • @Dhina 我已经编辑了我的代码,tvClicked 应该只是 tv(错字)。谢谢你的回答,我的问题是正确的,我问它和工作的方式是正确的,但我将来可能会使用动态 textViews,比如 textView tv = new TextView(this);而且不可能在全球范围内声明它

标签: android android-edittext textview android-dialogfragment android-dialog


【解决方案1】:

这是您的 TextView onClickListener 中应该有的内容:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Write new value for TextView");
final EditText editText = new EditText(this);
builder.setView(editText);
builder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {                 
                    }
                });
AlertDialog dialog = builder.create();
dialog.show();
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String newValue = editText.getText().toString();
                        if(newValue.lenght() == 0)
                            Toast.makeText(this, "You need to type something in the editText", Toast.LENGTH_LONG).show();
                        }else{
                            tv.setText(newValue);
                            dialog.dismiss();
                        }
                    });

也许需要做一些小的改动,因为我在这里写了代码。希望能帮助到你。祝你好运:)

LE:对话框editText不需要额外的Fragment和xml文件。

【讨论】:

  • 您好,感谢您的回答,这对我很有帮助。但是,如果我想留在 DialogFragment 旁边怎么办(看看为什么在这里 developer.android.com/guide/topics/ui/dialogs.html 和这里 stackoverflow.com/a/23946128/1644665)如果我想(或者我真的需要)从 someLayout.xml 分配我的 editText,我该怎么做?跨度>
  • 顺便说一句,如果我在你的回答中像你一样做,并且我想允许/容忍来自editText的空字符串“”并且电视的layout_width设置为wrap_content,那么我的电视是不可用的更新到“”(或刚刚消失)后更多。这个问题也有解决办法吗?
【解决方案2】:

好的,所以你还没有真正提到为什么你更喜欢使用 DialogFragment 而不是像 Victor Holotescu 回答的那样只使用 AlertDialog。但是在这里,我尝试了您的代码,并在尝试单击 更新按钮 时收到了 NullPointerException。于是我看了看,修改了代码,如下:

主活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView tv = (TextView) findViewById(R.id.tv_id);
        tv.setText("Initial value");

        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UpdateDialogFragment updDiag = new UpdateDialogFragment().newInstance(tv); // Passed the TextView here
                updDiag.show(getFragmentManager(), "dialog");
            }
        });
    }

    public static class UpdateDialogFragment extends DialogFragment {
        String value; // I try to get the value of EditText like this, but it doesn't work
        TextView tvToEdit;

        public UpdateDialogFragment newInstance(TextView tvToEdit){
            UpdateDialogFragment udf = new UpdateDialogFragment();
            udf.tvToEdit = tvToEdit;
            return udf;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            LayoutInflater inflater = getActivity().getLayoutInflater();

            builder.setView(inflater.inflate(R.layout.edit_tv, null))
                    .setPositiveButton("Update", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            EditText et = (EditText) UpdateDialogFragment.this.getDialog().findViewById(R.id.et_tv);
                            value = et.getText().toString();
                            tvToEdit.setText(value);
                        }
                    })
                    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            UpdateDialogFragment.this.getDialog().cancel();
                        }
                    });
            return builder.create();
        }
    }
}

我在代码中添加了一些TODO cmets(标有Read cmets。:)),检查一下。我测试了它,它运行正常。希望这能够以某种方式帮助您。有关AlertDialogs 和DialogFragments 的更多信息,这里有一个很好的帖子——DialogFragment advantages over AlertDialog

编辑

好的。所以我编辑了它,你只需通过创建一个 newInstance 方法将一个 TextView 传递给 UpdateDialogFragment——在这里引用它SetText of TextView in DialogFragment from Calling Activity——希望这会有所帮助。 :)

【讨论】:

  • 我尝试使用 DialogFragment,因为这个指南:developer.android.com/guide/topics/ui/dialogs.html 并且因为这个答案:stackoverflow.com/a/23946128/1644665 谢谢你的回答,但是我对@Dhian 说,你在全球范围内宣布电视,什么不适合我
  • @Yev 我修改了代码。如果您仍然更喜欢 DialogFragment,请尝试一下。
  • 另外,为了以防万一,您应该为传递的 TextView 添加一个空检查器以避免 NPE。
  • 非常感谢,你让我的̶d̶̶a̶̶y̶周过得愉快!
  • 是的,我认为使用 DialogFragment 更好,因为它管理对话框生命周期,例如,如果用户旋转屏幕。如果没有 DialogFragment,我的对话框就消失了。
猜你喜欢
  • 2018-04-19
  • 2015-05-09
  • 2022-02-04
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多