在项目中忽然遇到这样的问题,需要自定义对话框,对话框需要有一个输入框,以便修改所选中的价格,然后点击确定之后,修改所显示的价格。遇到的最大的问题就是如何能够获取到自定义对话框当中edittext输入的数值,百度了很久,看到的答案都是如下:

//得到自定义对话框  final View DialogView = a .inflate ( R.layout.loand, null);
这是关键的代码</span></strong></span>  //创建对话框                AlertDialog dlg = new AlertDialog.Builder(loand.this)        .setTitle("登录框")        .setView(DialogView)//设置自定义对话框的样式              .setPositiveButton("登陆", //设置"确定"按钮      new DialogInterface.OnClickListener() //设置事件监听        {                              public void onClick(DialogInterface dialog, int whichButton)            {             editText1 =(EditText) DialogView.findViewById(R.id.editText1);             editText2 =(EditText) DialogView.findViewById(R.id.editText2);             String id = editText1.getText().toString();             String password = editText2.getText().toString();                              //输入完成后,点击“确定”开始登陆                          c_log judge = new c_log();             boolean b_judge = judge.aa(id,password);             if(b_judge){              bar();             }else{//加东西                            DisplayToast("NO");                           }                                           }        })


上述方法对于使用系统自带的alertdialog来说,的确是没有问题,能够取到你输入的edittext的值,但对于自定义的alertdialog来说,就会始终拿到的是空的,我的解决方案是在自定义alertdialog里面取到edittext并且实例化,避免在activity里面进行初始化,步骤如下:

1.主要的activity主类代码:

package client.verbank.mtp.allone.frame.systemsettings;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.TextView;import android.widget.ToggleButton;import client.verbank.mtp.allone.R;import client.verbank.mtp.allone.component.CustomDialogPriceModify;import client.verbank.mtp.allone.consts.IBundleCommData;import client.verbank.mtp.allone.consts.ISystemCommData;import client.verbank.mtp.allone.frame.ControlFragment;import client.verbank.mtp.allone.frame.MainActivity;import client.verbank.mtp.allone.frame.systemsettings.nextpage.ChangePasswordActivity;import client.verbank.mtp.allone.frame.systemsettings.nextpage.ChangePhonePinActivity;import client.verbank.mtp.allone.frame.systemsettings.nextpage.ChooseRssActivity;import client.verbank.mtp.allone.frame.systemsettings.nextpage.SelectInstrumentActivity;import client.verbank.mtp.allone.util.SharepreferencesUtilSystemSettings;/** * 系统设置界面 *  * @Project:FEIB_AndroidStation * @Title:SystemSettingsFragment.java * @Packageclient.verbank.mtp.allone.frame.systemsettings * @Description:TODO * @authorqiulinheqiu.linhe@allone.cn * @date2015年9月29日上午11:48:53 * @Copyright:2015www.allone.cnInc.Allrightsreserved. * @versionV3.0.0 */public class SystemSettingsFragment extends ControlFragment implementsISystemCommData {// 四组需要打钩的textview初始化private TextView currencypairs;private TextView openpositionprice;private TextView floatingprofit;private TextView dealtime;private TextView ordercurrencypairs;private TextView pricehighend;private TextView priceendhigh;private TextView summarycurrencypairs;private TextView summaryfloatingprofit;private TextView riseandfall;private TextView applies;// 三个自定义输入金额private TextView inputamount2;private TextView inputamount5;private TextView inputamount10;// 跳转到下一个页面的4个textview,货币对选择、密码修改、凭证密码修改、RSS源选择private TextView Currencyofchoice;private TextView changepassword;private TextView changecertificatepassword;private TextView rsssource;ToggleButton mosthightoggle;ToggleButton mostlowtoggle;ToggleButton riseandfallmenutoggle;ToggleButton pricetimetoggle;View layout;// EditText price;AlertDialog dlg;int flagprice = 0;private Handler handler = new Handler();public SystemSettingsFragment(MainActivity activity) {super(activity);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View vi = inflater.inflate(R.layout.system_settings, container, false);// 价格修改弹出对话框layout = inflater.inflate(R.layout.activity_systemsettings_pricecustom_dialog,(ViewGroup) vi.findViewById(R.id.dialog));。。。。。。。。。。省略了部分代码,因为是公司项目的。。。。。。。。。。。。。。// 三个自定义金额的监听事件private void selfThreeMoneyLister(View vi) {inputamount2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {modifyPriceDialog();flagprice = 1;}});inputamount5.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {modifyPriceDialog();flagprice = 2;}});inputamount10.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {modifyPriceDialog();flagprice = 3;}});}// 点击价格,弹出编辑框,对价格进行修改private void modifyPriceDialog() {LayoutInflater factory = LayoutInflater.from(getActivity());final View DialogView = factory.inflate(R.layout.activity_systemsettings_pricecustom_dialog, null);final CustomDialogPriceModify.Builder builder = new CustomDialogPriceModify.Builder(getActivity());builder.setTitle("價格修改");builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {<span style="font-size:24px;color:#ff0000;"><strong>// 获取edittext的值String priceStr = builder.getPrice();//关键代码,getPrice放在自定义的alertdialog类里面,进行初始化</strong></span>if (flagprice == 1) {inputamount2.setText(priceStr);SharepreferencesUtilSystemSettings.putValue(getActivity(), System_key_SelfAmout2,priceStr);} else if (flagprice == 2) {inputamount5.setText(priceStr);SharepreferencesUtilSystemSettings.putValue(getActivity(), System_key_SelfAmout5,priceStr);} else {inputamount10.setText(priceStr);SharepreferencesUtilSystemSettings.putValue(getActivity(), System_key_SelfAmout10,priceStr);}// price.setText("");/** * 取得view的父组件,然后移除view */dialog.dismiss();}});builder.setNegativeButton(R.string.cancel,new android.content.DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub// ((ViewGroup) layout.getParent()).removeView(layout);dialog.dismiss();}});builder.create().show();}}
2.自定义alertdialog类,CustomDialogPriceModify.java,如下:

package client.verbank.mtp.allone.component;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import client.verbank.mtp.allone.R;/** * 系统设定中修改价格的弹出对话窗口 *  * @author wangyubo * */public class CustomDialogPriceModify extends Dialog {public CustomDialogPriceModify(Context context) {super(context);}public CustomDialogPriceModify(Context context, int theme) {super(context, theme);}public static class Builder {private Context context;private String title;private float textSize;private String message;private String positiveButtonText;private String negativeButtonText;private View contentView;private EditText priceText;private DialogInterface.OnClickListener positiveButtonClickListener;private DialogInterface.OnClickListener negativeButtonClickListener;public Builder(Context context) {this.context = context;}public Builder setMessage(String message) {this.message = message;return this;}public Builder setMessage(String message, float textSize) {this.message = message;this.textSize = textSize;return this;}/** * Set the Dialog message from resource *  * @param title * @return */public Builder setMessage(int message) {this.message = (String) context.getText(message);return this;}/** * Set the Dialog title from resource *  * @param title * @return */public Builder setTitle(int title) {this.title = (String) context.getText(title);return this;}/** * Set the Dialog title from String *  * @param title * @return */public Builder setTitle(String title) {this.title = title;return this;}public Builder setContentView(View v) {this.contentView = v;return this;}/** * Set the positive button resource and it's listener *  * @param positiveButtonText * @return */public Builder setPositiveButton(int positiveButtonText,DialogInterface.OnClickListener listener) {this.positiveButtonText = (String) context.getText(positiveButtonText);this.positiveButtonClickListener = listener;return this;}<span style="font-size:24px;color:#ff0000;"><strong>         //关键代码public String getPrice() {return priceText.getText().toString();}</strong></span>public Builder setPositiveButton(String positiveButtonText,DialogInterface.OnClickListener listener) {this.positiveButtonText = positiveButtonText;this.positiveButtonClickListener = listener;return this;}public Builder setNegativeButton(int negativeButtonText,DialogInterface.OnClickListener listener) {this.negativeButtonText = (String) context.getText(negativeButtonText);this.negativeButtonClickListener = listener;return this;}public Builder setNegativeButton(String negativeButtonText,DialogInterface.OnClickListener listener) {this.negativeButtonText = negativeButtonText;this.negativeButtonClickListener = listener;return this;}public CustomDialogPriceModify create() {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// instantiate the dialog with the custom Themefinal CustomDialogPriceModify dialog = new CustomDialogPriceModify(context, R.style.Dialog);dialog.setCanceledOnTouchOutside(false);dialog.setCancelable(false);View layout = inflater.inflate(R.layout.activity_systemsettings_pricecustom_dialog, null);dialog.addContentView(layout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));// set the dialog title<span style="font-size:24px;color:#ff0000;"><strong>((TextView) layout.findViewById(R.id.title)).setText(title);priceText = (EditText) layout.findViewById(R.id.price);//对edittext进行初始化,关键代码</strong></span>if (positiveButtonText != null) {((Button) layout.findViewById(R.id.positiveButton)).setText(positiveButtonText);if (positiveButtonClickListener != null) {((Button) layout.findViewById(R.id.positiveButton)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {positiveButtonClickListener.onClick(dialog,DialogInterface.BUTTON_POSITIVE);}});}} else {// if no confirm button just set the visibility to GONElayout.findViewById(R.id.positiveButton).setVisibility(View.GONE);}// set the cancel buttonif (negativeButtonText != null) {((Button) layout.findViewById(R.id.negativeButton)).setText(negativeButtonText);if (negativeButtonClickListener != null) {((Button) layout.findViewById(R.id.negativeButton)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {negativeButtonClickListener.onClick(dialog,DialogInterface.BUTTON_NEGATIVE);}});}} else {// if no confirm button just set the visibility to GONElayout.findViewById(R.id.negativeButton).setVisibility(View.GONE);}// set the content messageif (message != null) {TextView msgView = (TextView) layout.findViewById(R.id.message);msgView.setText(message);if (textSize != 0) {msgView.setTextSize(textSize);}} else if (contentView != null) {}dialog.setContentView(layout);return dialog;}}}

3.剩下的就是布局代码,包括一些圆角的,如果需要的可以参考我之前的博文,就不贴代码了。完成效果如下:


总结一些,对于自定义的对话框,无法在主activity中初始化对话框里的控件的时候,可以将初始化或者取值的操作放到自定义控件里面,这样就可以取值和赋值操作,忙活了一天,终于在师傅的指导下完成了这部分功能,看来单纯的看网上的答案,可能我几天都解决不了,还得多了解一些本质,对象得传递,得好好恶补一下基础知识,不懂得或者需要解释的可以联系我。



更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 更适合Android的集合 SparseArray/ArrayMap/ArraySet
  3. Android实现动态高斯模糊效果示例代码
  4. 史上最详细创建 Android(安卓)AIDL 远程服务步骤
  5. [置顶] Android与H5交互(混合开发)
  6. Android中的状态机(续)
  7. Android(安卓)上传图片到 Asp.Net 服务器的问题
  8. Android(安卓)Studio混淆相关总结
  9. Android性能优化---布局优化

随机推荐

  1. Android网络游戏之神农诀项目开发--视频
  2. 如何利用ant成生开源中的android初始环境
  3. Android中Timer使用示例
  4. Android(安卓)SDK 2.2 开发环境搭建
  5. Android(安卓)Compatibility Package
  6. Android学习(三)
  7. Android:控件布局(线性布局)LinearLayout
  8. Android抛出异常NetworkOnMainThreadExce
  9. (翻译)Android中的定时任务
  10. Ndk(jni)调用第三方的so库