有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扩展CustomDialog,edittext始终为空

我正在尝试向IconDialog(https://github.com/maltaisn/icondialoglib)添加自定义字段

我在xml中添加了一个新的EditText,并试图在我的活动OnCondialogicselected中访问它(当按下此对话框的Select按钮时,这是一个回调)

编辑文本。getText()始终为空,但在视图中调试时可以看到它

新类别:

public class InputIconDialog extends IconDialog {
    private EditText editText;
    public InputIconDialog() {

    }

    public String getInputText() {
        View v = getLayoutInflater().inflate(R.layout.icd_dialog_icon, null);
        editText = v.findViewById(R.id.icd_edt_InputName); // this editText exists but is always empty
        return editText.getText().toString();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    这里的问题是,您实际上并没有访问显示的视图。您在这一行View v = getLayoutInflater().inflate(R.layout.icd_dialog_icon, null);中的空父ViewGroup上增加了一个新的View。尽管已经创建了视图,但它与任何UI方面的内容都没有关联

    另一个问题是,在IconDialog中,您已经将对话框的内容设置为您在那里膨胀的视图dialog.setContentView(view);


    一个简单的解决方案是允许IconDialog的子元素更改其基本布局

    public class IconDialog extends DialogFragment {
    
        @LayoutRes
        protected int layoutRes = R.layout.icd_dialog_icon;
    
        Dialog onCreateDialog(final Bundle state) {
            LayoutInflater inflater = LayoutInflater.from(context);
            @SuppressLint("InflateParams") final View view = inflater.inflate(layoutRes, null);
    }
    
    public class InputIconDialog extends IconDialog {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            layoutRes = R.layout.icd_dialog_icon;
        }
    
    

    这种解决方案的一个主要缺点是它的长期可维护性,即IconDialog的子级需要在布局中包含它所依赖的所有视图,包括<inclue或复制


    推荐

    I would use onCreateView in IconDialog to set the layout and views and then override it in InputIconDialog and call super. That plus 3 layout files, one for icon_dialog, one for the shared views between the 2 dialogs and one for input_icon_dialog.