自定义dialog及布局(含EditText、Spinner)的输入设置和软键盘弹出设置

来源:互联网 发布:高晓松 知乎 编辑:程序博客网 时间:2024/05/16 09:38

问题描述:
本来自定义dialog,继承自AlertDialog类,加载自定义布局(内含edittext,spinner及确定、取消按钮),布局效果如下:

自定义的对话框

完成后发现点击edittext框不能弹出软键盘,无法输入内容。

解决办法:让自定义的dialog继承自dialog类,解决问题。

具体完整代码:

  1. 自定义的dialog类:
import android.app.Dialog;import android.content.Context;import android.content.res.Resources;import android.content.res.Resources.Theme;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.Window;import android.view.WindowManager;public class MyDialog extends Dialog {    private static int default_width = 300; //默认宽度    private static int default_height = 220;//默认高度    public MyDialog(Context context, int layout, int style) {    this(context, default_width, default_height, layout, style);    }    public MyDialog(Context context, int width, int height, int layout, int style) {    super(context, style);    //set content    setContentView(layout);    //set window params    Window window = getWindow();    WindowManager.LayoutParams params = window.getAttributes();    //set width,height by density and gravity    float density = getDensity(context);    params.width = (int) (width*density);    params.height = (int) (height*density);    params.gravity = Gravity.CENTER;    window.setAttributes(params);    }    private float getDensity(Context context) {    Resources resources = context.getResources();    DisplayMetrics dm = resources.getDisplayMetrics();    return dm.density;    }

注 : 我的dialog代码是在Fragment内完成的,在Activity类中类似,只需把代码中context的值:getActivity()替换为this即可.

在Fragment内初始化的部分代码(import包不再粘贴):

public class MyFragment extends Fragment {    ImageView ivAdd;//点击弹出自定义dialog的按钮    View view;//当前fragment的布局@Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // 创建View对象,并返回,类似BaseAdapter中的getView()        if(view == null) {            view = inflater.inflate(R.layout.fragment_my, null);        }        ViewGroup parent = (ViewGroup) view.getParent();        if(parent != null) {            parent.removeView(view);        }        ivAdd = (ImageView) view.findViewById(R.id.iv_my_add);        ivAdd.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //弹出自定义的MyDialog对话框                showMyDialog();            }        });    }}

自定义dialog方法showMyDialog()代码:

protected void showAlertDialog() {    View view = LayoutInflater.from(getActivity()).inflate(R.layout.item_alertdialog_layout,null);// 自定义布局    final MyDialog dialog = new MyDialog(getActivity(),R.layout.item_alertdialog_layout, R.style.MyDialog);    Button btnQuXiao = (Button) view.findViewById(R.id.btn_alertdialog_quxiao);    EditText etCompany = (EditText) view.findViewById(R.id.et_alertdialog_company);    EditText etNumber = (EditText) view.findViewById(R.id.et_alertdialog_number);    etCompany.setFocusable(false);//设置第一个edittext不可手动输入内容(即不可获取焦点),必须从右侧的下拉列表中选取    //配置下拉列表    Spinner spCompany = (Spinner) view.findViewById(R.id.iv_alertdialog_company);    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),                  R.array.companies, android.R.layout.simple_spinner_item);                                                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);      spCompany.setAdapter(adapter);      //为下拉列表设置监听    spCompany.setOnItemSelectedListener(new OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> arg0, View arg1,                    int arg2, long arg3) {        String company = getActivity().getResources().getStringArray(R.array.companies)[arg2];//获取选择的item内容        etCompany.setText(company);//将下拉列表中选择的item内容填充到前面的edittext中    }        @Override        public void onNothingSelected(AdapterView<?> arg0) {                // TODO Auto-generated method stub            }        });}

====> 未完待续

0 0
原创粉丝点击