首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在层次视图中获取EditBox

在层次视图中获取EditBox
EN

Stack Overflow用户
提问于 2017-03-02 07:07:58
回答 3查看 46关注 0票数 0

我在EditBox中动态地创建了LinearLayout。这是我的代码:

代码语言:javascript
复制
    final LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_relative);
    counter = 0;
    addButt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            counter += 1;
            LinearLayout ll = new LinearLayout(view.getContext());
            ll.setOrientation(LinearLayout.HORIZONTAL);
            ll.setTag(CONSTANT_LAYOUT + counter);
            LinearLayout.LayoutParams layoutParams = new
                    LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(30, 20, 30, 0);


            EditText etProduct = new EditText(view.getContext());
            etProduct.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
            etProduct.setTag(counter);

            ll.addView(etProduct);
            mainLayout.addView(ll);

      }

就像一种魅力。每当我点击特定的按钮,它就会创建新的线性布局,EditBox在那里和计数器上逐个增加,用户可以在_EditBox_es中增加价值。

现在,我想获得_EditBox_es的价值,我尝试了如下:

代码语言:javascript
复制
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            for (int i=0 ; i<counter ; i++) {                    

                View lr = mainLayout.findViewWithTag(CONSTANT_LAYOUT+i);
                EditText et = (EditText)lr.findViewWithTag(counter);
            }

        }
    });
}

但我有个错误:

致命异常:主进程: com.myapp,PID: 15055 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法的android.view.View java.lang.NullPointerException

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-02 07:11:14

请尝试以1而不是0启动for loop,并尝试将标记值大于1或equal给1而不是0。

代码语言:javascript
复制
        for (int i=1 ; i<=counter ; i++) {   // and condition should be i<=counter  = instead of less than               

            View lr = mainLayout.findViewWithTag(CONSTANT_LAYOUT+i);
            EditText et = (EditText)lr.findViewWithTag(counter);
        }
票数 1
EN

Stack Overflow用户

发布于 2017-03-02 07:11:46

你的循环从零开始。

代码语言:javascript
复制
for (int i=0 ; i<counter ; i++) {
   // No value for Zero index.
}

在设置标记时,您要添加+1,所以第一个值是1,而不是0。

代码语言:javascript
复制
counter += 1; // Default value of counter is zero
票数 1
EN

Stack Overflow用户

发布于 2017-03-02 07:21:00

您已经在根LinearLayout中添加了新的LinearLayout,也可以将setId()添加到新创建的LinearLayout而不是setTag()中,这对您也很好。

代码语言:javascript
复制
LinearLayout ll = new LinearLayout(view.getContext());
            ll.setOrientation(LinearLayout.HORIZONTAL);
            ll.setId(CONSTANT_LAYOUT + counter);
            LinearLayout.LayoutParams layoutParams = new
                    LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(30, 20, 30, 0);


            EditText etProduct = new EditText(view.getContext());
            etProduct.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
            etProduct.setId(counter);

            ll.addView(etProduct);
            mainLayout.addView(ll);

代码语言:javascript
复制
for (int i=0 ; i<counter ; i++) {                    

                LinearLayout ll = (LinearLayout )mainLayout.findViewById(CONSTANT_LAYOUT+i);
                EditText et = (EditText)ll .findViewById(counter);
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42548902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档