3

新しい行を作成し、手動でレイアウトを設定するテーブルビューがあります。各行には、画像、タイトルのテキストビュー、説明のテキストビューの 3 つの主要な要素があります。必要な場所に移動するために、2 つの線形レイアウトを使用します。説明用のテキストビュー(descViewという名前)にテキストを2行で表示したいのですが、代わりに-1つしか表示されません。何を間違えたのか、どのメソッドを呼び出すべきなのか、ビューにはテキストが 2 行で表示されます。テキストを(文字ではなく)単語ごとにラップする場合は完璧です。

私が今持っているもののスクリーンショット:

ここに画像の説明を入力

新しい行を作成するコード (「New」は、情報 (テキスト、画像など) を保存するオブジェクトです):

private TableRow formRow(New item) {

    //prepare table row parameters
    TableRow tr = new TableRow(this);
    tr.setBackgroundResource(R.drawable.results_table_row);
    tr.setVerticalGravity(Gravity.CENTER);
    tr.setTag(item.getTitle());
    tr.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.setBackgroundResource(R.drawable.results_table_row);

            } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
                v.setBackgroundResource(R.drawable.results_table_row_touched);
            }
            return true;
        }
    });


    //create main layout for content
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.HORIZONTAL);

    //add image
    int imageID = Integer.parseInt(item.getPictureSrc());
    ImageView image = new ImageView(this);
    image.setImageResource(imageID);
    image.setPadding(5, 5, 5, 5);
    layout.addView(image);

    //add another layout for title and description
    LinearLayout descLayout = new LinearLayout(this);
    descLayout.setOrientation(LinearLayout.VERTICAL);
    descLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    //add title
    TextView titleView = new TextView(this);
    titleView.setText(item.getTitle());
    titleView.setPadding(5, 0, 0, 0);
    titleView.setTextAppearance(this, R.style.TableRowStyle_ChildTitle);
    titleView.setLines(1);
    descLayout.addView(titleView);

    //add description
    TextView descView = new TextView(this);
    descView.setText(item.getDescription());
    descView.setPadding(5, 0, 0, 0);
    descView.setTextAppearance(this, R.style.TableRowStyle_ChildText);
    descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
    descView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    //descView.setEllipsize(TextUtils.TruncateAt.END);
    descView.setLines(2);
    descLayout.addView(descView);

    //add description layout to main layout
    layout.addView(descLayout);

    //finally, add layout to row
    tr.addView(layout);

    return tr;
}
4

3 に答える 3

1

私はいくつかのアプリケーションでこのような同様の設定をしていますが、個人的には、2 つの LinearLayouts を破棄し、これに 1 つの RelativeLayout を使用して、取り除こうとします:

descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
descView.setLines(2);

次に、アイテムを互いに相対的に配置し、その TextView の幅を FILL_PARENT に設定し、高さを WRAP_CONTENT に設定します。

RelativeLayout を使用すると、より均一な外観を得ることができます。

ImageView を ALIGN_PARENT_LEFT で設定し、左右に x-dip のマージンを与えます。

次に、タイトル TextView を追加し、ImageView の右側に配置します。

次に、Description TextView を追加し、ImageView の右側と Title の下に配置します。

ただし、コードを使用して実行しているので、両方とも同じフォント スタイル (タイトルは太字になっている) のように見えるので、さらに一歩進んで、タイトル/説明の両方に単一の TextView を作成し、次を使用します。 :

 textView.setText(Html.fromHtml("<b>" + item.getTitle() + "</b><br>" + item.getDescription())); 

すべてにリンク先の一意の ID を指定するようにしてください。まだ表示されていないものに合わせないでください。そうしないと、NPE をスローするか、まったく表示されなくなります。

しかし、ええ、いつでも LinearLayout を介して複数のコンポーネントを持つアイテムをリストするために RelativeLayout を使用します。

それが役立つことを願って〜

于 2012-05-30T17:56:40.147 に答える
0

TableRow に 1 列しかない場合android:shrinkColumns="0"は、TableLayoutの設定がこれを修正するのに役立つと思います。


TableRow に Layout パラメーターを追加します。

tr.setLayoutParams(new LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
       TableLayout.LayoutParams.WRAP_CONTENT));
于 2012-04-26T12:52:28.877 に答える
0

最大行をいくつかの数に設定し、最初のドットまでの文字を計算して文字の長さを設定します。したがって、アプリケーションは表示する情報の量を認識し、そのようなバグは表示されません

于 2012-06-20T07:56:14.027 に答える