【问题标题】:Extending a CustomDialog, edittext always empty扩展一个CustomDialog,edittext总是空的
【发布时间】:2019-11-04 17:33:19
【问题描述】:

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

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

editText.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();
    }
}

【问题讨论】:

    标签: java android inheritance dialog


    【解决方案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 或复制在其布局中包含它所依赖的所有视图。


    推荐

    我会在IconDialog 中使用onCreateView 来设置布局和视图,然后在InputIconDialog 中覆盖它并调用super。再加上 3 个布局文件,一个用于 icon_dialog,一个用于 2 个对话框之间的共享视图,一个用于 input_icon_dialog。

    【讨论】:

    • 感谢您的意见。那么,不接触 IconDialog 本身就没有实现这一点的选择吗?这就是我想避免的,所以我保持应用程序的可维护性。
    • 您可能可以从InputIconDialog 获取当前视图(IconDialog 视图)并对其进行更改,但这更难。您可以做的另一件更简洁的事情是在IconDialog 中使用onCreateView 来设置布局和视图,然后在InputIconDialog 中覆盖它并调用super。再加上 3 个布局文件,一个用于 icon_dialog,一个用于 2 个对话框之间的共享视图,一个用于 input_icon_dialog。如果我是你,我会采用这种方法
    • 我确实更新了 IconDialog。
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多