【问题标题】:Android - Programmatically adding button, setting ID crashesAndroid - 以编程方式添加按钮,设置 ID 崩溃
【发布时间】:2017-06-10 21:26:27
【问题描述】:

我根据加载的配置以编程方式将 x 数量的按钮添加到我的视图中(例如,我们只使用 10 个)。我创建 10 就好了,当我不设置 ID 或使用 Android 的 generateId() 函数时它可以工作,但我想使用我的迭代器 (i) 来设置 id,以便每个值迭代匹配它创建的按钮

(for i=0; i<10; i++)
{
     button.setId(i);
 }

我希望这样当我切换片段时,它会保存按钮并且我不会使用 onCreate 重新创建它们。就目前而言,我收到此错误:

 01-25 17:46:18.197  13236-13236/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.CompoundButton$SavedState
        at android.widget.CompoundButton.onRestoreInstanceState(CompoundButton.java:379)

【问题讨论】:

  • 你为什么不用button.setTag("yourID")
  • 好吧,如果我给它一个 ID,它不会保存它是在 Saved Bundle 中创建的事实吗?否则,我每次切换回片段时只会创建 10 个新按钮。
  • 我认为您的问题是将相同的 id 设置为另一个视图。确保您的活动对清单中的特定情况进行了 configChanges,并在 onConfigChange 中处理您的解决方案。

标签: java android dynamic error-handling


【解决方案1】:

您可以在 for 中使用 generateViewId 并创建一个方法来从 ArrayList 中获取您的按钮。

试试这个:

public class YourClass {

    public ArrayList<Integer> ids = new ArrayList<>();

    public void generateButtons(){
        for (int i = 0; i< 10; i++) {
            ids.add(View.generateViewId());
            // your code to create the button
            button.setId(ids.get(i));
        }
    }

    public Button getButton(int index){
        return (Button) findViewById(ids.get(index));
    }

}

或者只是创建一个按钮的 ArrayList...

【讨论】:

  • 谢谢...我实际上只是让我的唯一 ID 从 400 开始并遍历按钮的数量,我猜在另一个 ID/视图之间存在 ID 冲突...哈哈.我花了很多时间研究演员阵容以及其他帖子上没有的内容,我想我只是想要 button 和 uniqueID 之间的对应 id 但这会做。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多