我想达到以下结果:
所有四个视图都是从数据库中填充的,因此具有动态宽度(IV除外)。
ID从左到右:
icon
tv_top
tv_bottom
tv_right
我从本教程(Vogella Android ListView)中获取了这个相对布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="5dip" >
<ImageView
android:id="@+id/icon"
android:layout_width="@dimen/photo_item_size"
android:layout_height="@dimen/photo_item_size"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_marginRight="10dp"
android:src="@drawable/ic_launcher"
>
</ImageView>
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/icon"
android:layout_gravity="right"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="1dp"
android:textSize="27sp"
>
</TextView>
<TextView
android:id="@+id/tv_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/icon"
android:ellipsize="end"
android:singleLine="true"
android:textSize="14sp"
>
</TextView>
<TextView
android:id="@+id/tv_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:ems="10"
android:textSize="21.5sp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toRightOf="@id/icon"
android:singleLine="true"
android:ellipsize="end"
android:layout_marginRight="70dp"
>
</TextView>
我的问题是我想根据tv_right的宽度动态更改tv_top的宽度。如果tv_right变大,我想让我的tv_top宽度更小。
目前,我使用android:layout_marginRight="70dp"
命令为我的视图设置固定大小。
我也试过(在我的适配器中 - 以编程方式)像:
RelativeLayout.LayoutParams llp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int relativeUsageWidth = viewHolder.tvAppRelativeUsage.getWidth(); // width is always 0
llp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT | RelativeLayout.ALIGN_PARENT_TOP);
llp.addRule(RelativeLayout.RIGHT_OF,R.id.icon);
llp.setMargins(0, 0, relativeUsageWidth, 0);
有没有比编程更好的方法(也许是xml方式)?我应该使用线性布局吗?哪个是解决这个问题的最佳方法?
答案 0 :(得分:1)
在中间的TextView中,不要使用带有额外边距的android:layout_alignParentRight="true"
,但要将它们设置为左侧ImageView的右侧,右侧TextView的左侧,并将宽度设置为{{1 }}。这将使它们直接适合于其他两个视图之间。
两个TextView的示例:
match_parent
再次为两个视图添加一个小边距,这样他们就不会直接粘贴在其他视图上。
答案 1 :(得分:1)
您可以使用LinearLayout
和layout_weight
。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="80dp"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher"/>
<!-- weight 3 of 4 = 3/4 of available width for this LinearLayout -->
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<TextView
android:id="@+id/tv_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignBottom="@+id/tv_bottom"
android:text="Top line"/>
<TextView
android:id="@+id/tv_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Bottom line"/>
</RelativeLayout>
<!-- weight 1 of 4 = 1/4 of available width for this TextView -->
<TextView
android:id="@+id/tv_right"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="Right text"/>
</LinearLayout>
答案 2 :(得分:1)
这可以使用任何其他布局来实现。我们只需要一个RelativeLayout
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/iv_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/iv_left"
android:layout_alignParentRight="true"
android:gravity="center"
android:singleLine="true"
android:text="ABC"
android:textSize="24sp"
android:background="#888"
android:textStyle="bold" />
<TextView
android:id="@+id/et_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_left"
android:layout_toLeftOf="@id/tv_right"
android:singleLine="true"
android:text="@string/app_name"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/et_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_left"
android:layout_toLeftOf="@id/tv_right"
android:layout_below="@id/et_top"
android:singleLine="true"
android:text="@string/app_name"
android:textSize="14sp" />
</RelativeLayout>
您可以根据自己的意愿设置填充和边距。
[编辑] oops没有注意到正确的一个是TextView ...代码更新..
希望有所帮助:)