如何把文本输入与DialogFragment Android中?文本、DialogFragment、Android

2023-09-06 10:12:34 作者:\]我会重生i

我试图让用户进入到一个对话框值,使用推荐DialogFragment类吧,对话结构和运行正常,但我不能返回的EditText参数父类的值,没有得到空指针异常。

我DialogHost类,这个构造,退货和家长链接到它的按钮。

 包jo.app.co;进口android.app.Activity;进口android.app.AlertDialog;进口android.app.Dialog;进口android.app.DialogFragment;进口android.content.DialogInterface;进口android.os.Bundle;进口android.view.LayoutInflater;公共类DialogHost扩展DialogFragment {公共接口NoticeDialogListener {    公共无效onDialogPositiveClick(DialogFragment对话);    公共无效onDialogNegativeClick(DialogFragment对话);}NoticeDialogListener mListener;@override公共无效onAttach(活动活动){    super.onAttach(活动);    尝试{        mListener =(NoticeDialogListener)活性;    }赶上(抛出ClassCastException E){        抛出新ClassCastException异常(activity.toString());    }}@override公共对话框onCreateDialog(捆绑savedInstanceState){    AlertDialog.Builder建设者=新AlertDialog.Builder(getActivity());    LayoutInflater吹气= getActivity()getLayoutInflater()。    builder.setView(inflater.inflate(R.layout.dialog_add,NULL))           .setPositiveButton(保存,新DialogInterface.OnClickListener(){               @override               公共无效的onClick(DialogInterface对话,诠释的id){                   mListener.onDialogPositiveClick(DialogHost.this);               }           })           .setNegativeButton(取消,新DialogInterface.OnClickListener(){               公共无效的onClick(DialogInterface对话,诠释的id){                   DialogHost.this.getDialog()取消()。               }           });    返回builder.create();}} 

这是显示对话框我MainActivity类别

 包jo.app.co;进口android.app.DialogFragment;进口android.os.Bundle;进口android.support.v4.app.FragmentActivity;进口android.util.Log;进口android.widget.EditText;公共类MainActivity扩展FragmentActivity实现DialogHost.NoticeDialogListener { @override保护无效的onCreate(捆绑savedInstanceState){    super.onCreate(savedInstanceState);    的setContentView(R.layout.activity_main);    showNoticeDialog();}公共无效showNoticeDialog(){    DialogFragment对话框=新DialogHost();    dialog.show(getFragmentManager(),DialogHost);}@override公共无效onDialogPositiveClick(DialogFragment对话){    会将myText的EditText =(EditText上)findViewById(R.id.item_added);    尝试{        Log.d(中尝试的myText.getText()的toString());    }    赶上(例外五){        Log.e(渔获,e.toString());    }}@override公共无效onDialogNegativeClick(DialogFragment对话){    Log.d(INMAIN,已达到NEG);} } 

参考我的对话Thisthe布局。

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android   机器人:方向=垂直   机器人:layout_width =WRAP_CONTENT   机器人:layout_height =WRAP_CONTENT>    <的EditText       机器人:ID =@ + ID / item_added       安卓的inputType =TEXT       机器人:layout_width =match_parent       机器人:layout_height =WRAP_CONTENT       机器人:layout_marginTop =16DP       机器人:layout_marginLeft =4DP       机器人:layout_marginRight =4DP       机器人:layout_marginBottom =4DP       机器人:提示=@字符串/ hint_add_item/>< / LinearLayout中> 
Android官方推荐 DialogFragment创建对话框

解决方案

有似乎是你指的是编辑文本的方式问题。你需要从你虚增请尝试以下code添加了所有的功能在你的主要活动本身的看法得到它。如果你想你能适应你的情况有一个单独的类:

 公共无效showNoticeDialog(){公共inputValue的字符串;LayoutInflater吹气= LayoutInflater.from(本);最后查看textenter = inflater.inflate(R.layout.dialog_add,NULL)最终的EditText userinput =(EditText上)textenter.findViewById(R.id.item_added);最后AlertDialog.Builder建设者=新AlertDialog.Builder(本);builder.setView(textenter)          .setTitle(您的标题);builder.setPositiveButton(保存,新DialogInterface.OnClickListener(){               @override               公共无效的onClick(DialogInterface对话,诠释的id){                   inputValue将= userinput.getText()的toString()。                  //做点什么inputValue的中值               }           })           .setNegativeButton(取消,新DialogInterface.OnClickListener(){               公共无效的onClick(DialogInterface对话,诠释的id){                 dialog.cancel();               }           });    AlertDialog对话框= builder.create();          builder.show();         } 

有关警告对话框中,你需要膨胀的XML,只有当你计划有像在该对话框超过1的EditText多个视图。如果您计划只有1个的EditText在你的榜样,你不需要一个XML,你可以直接定义一个EditText,并将其设置的警告对话框中的视图。

 最后的EditText userinput =新的EditText(背景);            builder.setView(userinput); 

I am trying to get a value that user enters into a Dialog, using the recommended DialogFragment class for it, the Dialog constructs and runs fine, but I cannot return the value of the EditText parameter to the parent class, without get a Null pointer exception.

My DialogHost class, this constructs, returns and links the parent to its buttons.

package jo.app.co;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;

public class DialogHost extends DialogFragment {


public interface NoticeDialogListener {
    public void onDialogPositiveClick(DialogFragment dialog);
    public void onDialogNegativeClick(DialogFragment dialog);
}

NoticeDialogListener mListener;

@override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {

        mListener = (NoticeDialogListener) activity;

    } catch (ClassCastException e) {      

        throw new ClassCastException(activity.toString());
    }
}

@override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.dialog_add, null))

           .setPositiveButton("Save", new DialogInterface.OnClickListener() {

               @override
               public void onClick(DialogInterface dialog, int id) {        
                   mListener.onDialogPositiveClick(DialogHost.this);                       

               }
           })
           .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   DialogHost.this.getDialog().cancel();                       
               }
           });      
    return builder.create();
}

}

This is my MainActivity class showing the Dialog

package jo.app.co;

import android.app.DialogFragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.EditText;

public class MainActivity extends FragmentActivity implements      DialogHost.NoticeDialogListener {


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

}

public void showNoticeDialog() {

    DialogFragment dialog = new DialogHost();
    dialog.show(getFragmentManager(), "DialogHost");
}


@override
public void onDialogPositiveClick(DialogFragment dialog) {

    EditText myText = (EditText) findViewById(R.id.item_added);
    try {
        Log.d ("IN TRY", myText.getText().toString());          
    }
    catch (Exception e) {
        Log.e ("IN CATCH", e.toString());
    }           

}

@override
public void onDialogNegativeClick(DialogFragment dialog) {        
    Log.d ("INMAIN", "REACHED NEG");
}


 }

Thisthe layout of my Dialog for reference.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">

    <EditText
       android:id="@+id/item_added"
       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="@string/hint_add_item" />

</LinearLayout>

解决方案

There seems to be problem with the way you are referring to the edit text. You need to get it from the view you inflated Please try the below code which adds all functionality in your main activity itself. If you want you can adapt to your case with a separate class:

public void showNoticeDialog() {

public String inputvalue;

LayoutInflater inflater = LayoutInflater.from(this);
final View textenter = inflater.inflate(R.layout.dialog_add, null)
final EditText userinput = (EditText) textenter.findViewById(R.id.item_added); 
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(textenter)
          .setTitle("Your title");
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {

               @override
               public void onClick(DialogInterface dialog, int id) {        
                   inputvalue =  userinput.getText().toString();                  
                  // Do something with value in inputvalue
               }
           })
           .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                 dialog.cancel();

               }
           });      
    AlertDialog dialog = builder.create();
          builder.show();
         }

For alert dialog , you need to inflate an xml, only if you are planning to have multiple views like more than 1 edittext in that dialog. If you plan to have only 1 edittext as in your example, you dont need an xml and you can directly define an edittext and set it as the view of the alert dialog.

final EditText userinput = new EditText(context);
            builder.setView(userinput);