如何以编程方式查找ViewbyId到TextView

时间:2013-01-04 09:15:36

标签: android layout

我有一个动态编程的textView列表......

GridView layout = (GridView) context.findViewById(R.id.linearLayout1);
        PrizeAdapter adapter = new PrizeAdapter(context, 0, 0, game.getPrizeList());
        layout.setAdapter(adapter);

适配器类:

public class PrizeAdapter extends ArrayAdapter<String> {

    private List<String> objects;

    public PrizeAdapter(Context context, int resource, int textViewResourceId,
            List<String> objects) {
        super(context, resource, textViewResourceId, objects);
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView text = new TextView(getContext());
        text.setId(position);
        text.setText(objects.get(position));
        text.setTextSize(12);
        text.setPadding(0, 5, 0, 5);
        text.setTextColor(Color.WHITE);
        text.setBackgroundColor(Color.GRAY);
        text.setGravity(Gravity.CENTER | Gravity.BOTTOM);
        return text;
    }

}

据说,我创建了一个10 TextView。我怎样才能获得特定的textView,以便我可以对它进行不同的着色。

我试过这个

GridView layout = (GridView) context.findViewById(R.id.linearLayout1);
TextView view = (TextView) layout.findViewById(1);
view.setBackgroundColor(Color.YELLOW);
view.setTextColor(Color.RED);

但它不起作用,只是遇到了一个nullpointer异常。 请帮忙。

2 个答案:

答案 0 :(得分:1)

这种行为的原因是你做得太早。 即使在使用id 1创建视图之前,您也试图访问它们。

所以发生的事情是,你要求适配器膨胀视图,适配器控制检查什么是可见的以及应该显示什么。 并且在if(在填充视图之前)之后立即调用findviewbyID(1),因此仍然不会创建此视图,因此您将获得空指针。

如果我们在填充网格后尝试使用按钮执行任务,则代码将起作用。

  final GridView layout = (GridView) findViewById(R.id.linearLayout1);
    PrizeAdapter adapter = new PrizeAdapter(this, 0, 0, objects2);
    layout.setAdapter(adapter);


    findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            TextView view = (TextView) layout.findViewById(1);
            view.setBackgroundColor(Color.YELLOW);
            view.setTextColor(Color.RED);

            // TODO Auto-generated method stub

        }
    });

所以2解决方案

1)更改颜色的延迟处理程序帖子。

2)创建一个自定义回调接口,它将返回视图1加载的结果。

答案 1 :(得分:0)

使用ViewGroup.getChildAt(position),它会返回该位置的视图。然后将它转换为TextView(当您将TextView设置为直接项目视图时)以设置颜色。

除非为对象设置ID,否则在动态创建对象时不能使用findViewById()。