0

奇妙な問題があります。TableRow から MessageRow を派生させました。テーブルに 1 つの TableRow (ヘッダー) と 100 の MessageRow を設定しました。しかし、テーブルを 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の違いを検出できません。

補足: これが最善の方法かどうかはわかりませんが、2 つの変数を比較するために、右クリックして変数をコピーし、2 つの異なるファイル (bt1 用と bt2 用) で notepad++ に貼り付けて使用しました。比較プラグイン。

4

2 に答える 2

0

パズルの最後のピース。
私は多くのバリエーションを試しましたが、最終的にはうまくいきました!LayoutParamsTableRow.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;
}
于 2012-04-22T07:29:48.367 に答える
0

いくつかの詳細情報。ボタンを表示することができました。さらにデバッグすると、関数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;
}
于 2012-04-22T07:10:10.200 に答える