【问题标题】:Android first TableRow is not showingAndroid第一个TableRow没有显示
【发布时间】:2012-04-22 15:29:48
【问题描述】:

我有一个奇怪的问题。我从 TableRow 派生了 MessageRow。我用一个 TableRow(标题)和 100 个 MessageRows 填充了一个表。但是当我将表格添加到 Horizo​​ntalScroll 视图时只有 Messagerows 显示。 如果我在调试器中检查表,所有行都在那里,包括标题,以及正确的子级和文本。

这是简化的代码:

public class MessageRow extends TableRow {
    public TextView tvData1;
    public TextView tvData2;
    public TextView tvData3;

    public MessageRow(Context context) {
        this(context, null);
    }

    public MessageRow(Context context, AttributeSet attrs) {
        super(context, attrs);
        tvData1 = new TextView(context);
        tvData2 = new TextView(context);
        tvData3 = new TextView(context);
    }

    public void setData(String data1, String data2, String data3) {
        tvData1.setText(data1);
        tvData2.setText(data2);
        tvData3.setText(data3);

        addView(tvData1);
        addView(tvData2);
        addView(tvData3);
    }
}

活动代码:

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

        mTable = new TableLayout(this);

        HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);
        mTable.setBackgroundColor(Color.WHITE);
        populate(mTable);
        hview.addView(mTable);
    }


    public void setHeader(TableLayout tl) {
        TableRow mHeader = new TableRow(getContext());
        mHeader.addView(getColumnHeader("Data#1"));
        mHeader.addView(getColumnHeader("Data#2"));
        mHeader.addView(getColumnHeader("Data#3"));
        mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        tl.addView(mHeader);
    }

    public void populate(TableLayout tl) {
        setHeader(tl);
        for(int i = 0; i < 100; i++) {
            MessageRow mr = new MessageRow(getContext());
            mr.setMessage("xxx"+i,"yyy"+i,"zzz"+i);
            mr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            tl.addView(mr);
        }
    }

    private Button getColumnHeader(String name) {
        Button bt = new Button(getContext());
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.rightMargin = params.leftMargin = 2;
        bt.setLayoutParams(params);
        bt.setText(name);
        return bt;
    }



现在,我尝试绕过 getColumnHeader() 函数,如下所示:

    public void setHeader(TableLayout tl) {
        TableRow mHeader = new TableRow(getContext());
        //mHeader.addView(getColumnHeader("Data#1"));
-->         Button bt1 = new Button(getContext());
-->         bt1.setText("Data#1");
-->         mHeader.addView(bt1);
        //mHeader.addView(getColumnHeader("Data#2"));
-->         Button bt2 = getColumnHeader("Data#2");
-->         mHeader.addView(bt2);

        mHeader.addView(getColumnHeader("Data#3"));
        mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        tl.addView(mHeader);
    }

然后显示bt1(Data#1)!!!但不是 Data#2 或 Data#3。这暗示函数 getColumnHeader() 是不好的。但不是根据调试器,当我 检查 bt1 和 bt2 看起来不错时,我无法检测到手动实例化的按钮 bt1 和返回的按钮 bt2 之间的 区别 是什么。

旁注:我不知道这是否是最好的方法,但要比较两个变量,我只是右键单击并复制变量,然后将其粘贴到 notepad++ 的两个不同文件中(一个用于 bt1 和一个用于 bt2) 并使用了比较插件。

【问题讨论】:

    标签: android button tablerow


    【解决方案1】:

    更多信息。
    我设法显示了按钮,进一步调试显示为函数 getColumnHeader() 中的每个按钮设置布局参数导致了问题。
    我仍然不知道为什么。

    按钮成员 mLayoutParams 为 null 是可以的,但是当创建 (.setLAyoutParams()) 并分配值(例如宽度和高度)时,按钮突然不显示了。
    这是补丁,...直到我弄清楚原因。

    private Button getColumnHeader(String name) {
        Button bt = new Button(getContext());
        //LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        //params.rightMargin = params.leftMargin = 2;
        //bt.setLayoutParams(params);
        bt.setText(name);
        return bt;
    }
    

    【讨论】:

      【解决方案2】:

      拼图的最后一块。
      我尝试了很多变化,终于成功了!
      LayoutParams 替换为 TableRow.LayoutParams 就可以了。
      它们的结构非常相似,甚至可能 TableRow.LayoutParams 都是从 LayoutParams 派生的。
      我将把谜团留在这里,直到一些专家阐明为什么会发生这种情况。

      最终代码:

      private Button getColumnHeader(String name) {
          Button bt = new Button(getContext());
          TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
          params.rightMargin = params.leftMargin = 2;
          bt.setLayoutParams(params);
          bt.setText(name);
          return bt;
      }
      

      【讨论】:

      • 如果您找到了问题的解决方案,请接受您自己的答案,以便将问题标记为已回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2011-08-07
      • 2018-05-01
      相关资源
      最近更新 更多