android setBackgroundColor在运行时和其他一般混乱有帮助吗?

时间:2011-11-14 17:24:30

标签: android

我有一排这样的buttins 我想在代码中改变运行时的背景颜色。

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

LinearLayout track1 = (LinearLayout)findViewById(R.id.my_toggle_container); 

for (int i = 0; i<32; i++) {
        ToggleButton tgl = new ToggleButton(this);
        tgl.setId(i);
    ...
track1.addView(tgl);

这命名为togglebuttons 1,2,3的id ...(我假设?) 我有一个名为'xBtn'的int变量,它改变了1,2,... 这就是我如何使用xBtn

获得对按钮的引用
String buttonID = ""+xBtn;
            int resID = getResources().getIdentifier(buttonID, "id", "com.thing");
            //find the button
            ToggleButton tb = (ToggleButton) findViewById(resID);
            //change its colour
            tb.setBackgroundColor(Color.BLUE); 

它在setBackgroundColor行崩溃。

对某些人来说可能是显而易见的,这就是我所希望的 任何帮助都将是完全一致的 感谢

main.xml中

<LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/my_toggle_container" android:orientation="vertical">

5 个答案:

答案 0 :(得分:1)

你的togglebuttons的id将是一个从1到32的数字...但是,尝试按id找到切换按钮将返回null,因为只是实例化一个新的切换按钮并给出一个id不会帮助你。 findViewById在父视图中查找具有指定标识的子视图。如果您没有将具有该id的切换按钮添加到视图,则findViewById将返回null。即使没有查看日志,我仍然99.99%肯定,因为你在空对象上调用setBackgroundColor它崩溃了。

换句话说,只有在视图实际添加到父视图后,您设置视图的ID才有意义。在您的情况下,您可能正在尝试将这些切换按钮添加到主内容视图中,在这种情况下,您需要抓住用于setContentView的视图并在该视图上调用addView并传入每个新的切换按钮。请注意,除非您还为togglebuttons指定layoutparams,否则这可能看起来不正确。

修改

如果那是你的整个main.xml,那么你还有其他问题。发布完整的xml文件。在任何情况下,你仍然必须做我所说的,即抓住视图或该视图的子视图,然后通过addView添加切换按钮(在给予togglebuttons它们之后) IDS)。添加按钮后,您就可以找到它。请注意,如果您要将切换按钮添加到主视图的子视图中,那么您可能必须抓住该子视图并在此处调用findViewById。

例如,您可以像这样执行嵌套调用。 findViewById(1)&lt; ---获取LinearLayout或主内容视图中的任何内容,然后一旦你有了它就可以调用addView。所以LinearLayout ll =(LinearLayout)findViewById(someNumber); ll.addView(TB);

答案 1 :(得分:0)

也许tbnull?你能检查一下吗?

答案 2 :(得分:0)

tb null很可能是findViewById(),因为try { tb.setBackgroundColor(Color.BLUE); } catch (Exception e){ } 没有按预期进行。

你可以通过try .. catch block:

包围错误的行来验证这一点
getResources().getIdentifier(buttonID, "id", "com.thing")

并注意e的信息。它很可能是空指针异常。

事实上,我认为你不应该首先使用R。在我看来,所有这些资源都在// The following code is not tested; I just wrote it here on SO. for (int resID = R.id.button1; resID <= 32; resID++) { ToggleButton tb = (ToggleButton) findViewById(resID); tb.setBackgroundColor(Color.BLUE); } 文件中连续编号,因此您应该只获取第一个id(作为整数),然后对其进行递增。

也就是说,你应该做以下事情:

{{1}}

这应该使所有32个按钮变蓝。

答案 3 :(得分:0)

要扩展LuxuryMode所说的内容......什么获得ID INTO你的java是通过setContentView膨胀它并将其设置为内容。这就是为什么在不同的布局中有重叠(重复)ID的原因。您可以在layout1.xml和layout2.xml中使用@ + id / submit_button,并且Activity将通过findViewById(R.id.submit_button)根据您在任何给定时刻加载到setContentView()中的对象来获取对象。

所以,我们都猜测你可能没有设置内容视图,希望代码能够在非膨胀的XML中找到你的对象,而不是。哪个会导致(正如大家猜测的那样)现在处理一个空对象,你显然无法设置背景颜色。

我知道它让人感到困惑因为你有XML正确的!!!但实际情况是xml并非“活着”。在您对应用程序进行任务并将其全部转换为某种类型的Android对象之前,这只是让您查看的内容。很多时候这对你来说是透明的,所以很容易忘记这些事情都不存在。

答案 4 :(得分:0)

尝试使用setTag()方法,然后您可以使用以下方法获取所有ToggleButtonfindViewByTag();