【问题标题】:Get Fragments edittext values on Activity button click event在Activity按钮单击事件上获取片段edittext值
【发布时间】:2014-06-23 16:38:35
【问题描述】:

我有一个包含 2 个片段的 viewpager,每个片段都包含一个编辑文本。当用户单击活动中的按钮时,我需要将片段中的 edittext 值获取到活动中。我参考了这个文档Communicating with Other Fragments,就像当用户单击片段中的列表项时,我将获得活动中的值。但在我的情况下,按钮处于活动状态。有人能建议这样做的正确方法吗

【问题讨论】:

    标签: android android-activity android-viewpager fragment


    【解决方案1】:

    您可以像 Christopher Francisco 建议的那样进行操作(使用 TextWatchers),也可以将 ID 分配给 EditTexts 并像这样检索它们的数据(在 Activity 内的 Buttons onClickListener 中):

    String editText1Data = ((EditText) findViewById(R.id.editText1)).getText().toString();
    String editText2Data = ((EditText) findViewById(R.id.editText2)).getText().toString();
    ....
    

    【讨论】:

    • 我搜索了很多次所有解决方案都是使用观察者和听众!!!你的回答更简单明了!为什么其他人使用这种方法?!有什么好处吗?
    • 很好的答案!正是我想要的:)
    • 非常感谢。
    【解决方案2】:

    不是Activity 向Fragment 询问数据,而是将数据从Fragment 传递到Activity(无需询问)。

    我的意思是,将TextWatcher 接口添加到EditText 和afterTextChanged() 使用接口(再次阅读http://developer.android.com/training/basics/fragments/communicating.html)将其传递给Activity。当用户按下按钮时,您不必从片段中检索值,因为您已经拥有它们,您只需应用逻辑即可。

    例如:

    // Inside Activity, it should implement FragmentInterface1, FragmentInterface2
    private String str1;
    private String str2
    
    @Override
    public void onFragment1EditTextChanged(String string) {
        str1 = string;
    }
    
    @Override
    public void onFragment2EditTextChanged(String string) {
        str2 = string;
    }
    
    // This is for each Fragment1 and Fragment2, just change the number acordingly
    private FragmentInterface1 listener = null;
    
    @Override
    public View onCreateView(/*params*/) {
    
        // inflate the view
    
        edittext = (EditText) view.findViewById(R.id.myEditText);
        edittext.addTextWatcher(new TextWatcher() {
    
            // Any callback works, but i'd go for this one
            public void afterTextChanged(/*params*/) {
                if(listener != null) listener.onFragment1EditTextChanged(edittext.getText().toString());
            }
        });
    }
    
    @Override
    public void onAttach(Activity activity) {
        listener = (FragmentInterface1) activity;
    }
    
    public interface FragmentInterface1 {
        public void onFragment1EditTextChanged(String string);
    }    
    

    【讨论】:

    • 感谢您及时回复克里斯托弗,我对您的帖子有疑问。如果我有更多的输入控件比如 3 到 4 个编辑文本和 1 或 2 个选择器等,我该如何扩展它。将更改事件放置到单个控件的上述逻辑是否是实现它的正确方法?
    • 确实,我所做的是在onFragment1EditTextChange() 方法(显然,使用不同的名称 heheheh)上放置与片段中的输入视图一样多的参数
    • 如果您发现我的帖子有帮助,您可以考虑将其标记为已接受的答案,以便其他人能够知道您是如何解决您的问题的(:
    • 抱歉迟到了,我无法从您的评论中弄清楚您能否给我一个示例或详细说明一下。
    • 很棒且非常有用的答案 :) 比原始文档更好的解释。
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多