android - >相对布局更改按钮文本对齐点击

时间:2011-07-17 19:21:14

标签: android layout

这是我的main.xml:`

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:addStatesFromChildren="false"
    android:layout_height="wrap_content">
    <TableLayout
        android:id="@+id/header"
        android:layout_marginRight="2dp"
        android:layout_marginLeft="2dp"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:layout_width="fill_parent"
        android:layout_alignParentTop="true">
        <TableRow>
            <TextView
                android:id="@+id/leftHeader"
                android:textColor="@android:color/black"
                android:layout_margin="1dp"
                android:gravity="center_horizontal"
                android:layout_weight="1"
                android:background="#ffcccccc"
                android:text="textview1"
                android:layout_width="30dip" />
            <TextView
                android:id="@+id/rightHeader"
                android:textColor="@android:color/black"
                android:gravity="center_horizontal"
                android:layout_weight="1"
                android:layout_margin="1dp"
                android:background="@android:color/white"
                android:text="textview2"
                android:layout_width="70dip" />
        </TableRow>
    </TableLayout>
<ScrollView
    android:id="@+id/table_scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="2dp"
    android:layout_marginLeft="2dp"
    android:layout_below="@+id/header"
    android:layout_above="@+id/buttonTable">
    <TableLayout
        android:id="@+id/maintable"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black">
        <TableRow
            android:id="@+id/maintableRow">
            <TextView
                android:id="@+id/maintableLeft"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:layout_marginRight="1dp"
                android:layout_marginLeft="1dp"
                android:text="textview1"
                android:layout_width="30dip" />
            <TextView
                android:id="@+id/maintableRight"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:layout_marginLeft="1dp"
                android:layout_marginRight="1dp"
                android:text="textview2"
                android:layout_width="70dip" />
        </TableRow>
    </TableLayout>
</ScrollView>
<TableLayout
    android:id="@+id/buttonTable"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/black"
    android:layout_alignParentBottom="true">
    <TableRow>
        <Button
            android:id="@+id/button_ResetData"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:text="Reset Data"
            android:layout_gravity="center"
            android:layout_weight="1" />
        <Button
            android:id="@+id/button_Refresh"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:text="Refresh"
            android:gravity="center"
            android:layout_weight="1" />
    </TableRow>
</TableLayout>

`

按下其中一个按钮后,文本对齐方式向左移动,如何让它保持在中心位置? 类似的事情发生在第一个表(标题)(textview1,textview2)但在这里它还减少了文本大小视图中文本的数量......

编辑:我设法找到导致更改的代码,但我不知道如何解决这个问题。 也许有人可以解释为什么会发生这种情况以及如何解决它?

    private void fillTableView(List<BatteryInfo> list) {

    TextView leftHeader = (TextView) findViewById(R.id.leftHeader);
    TextView rightHeader = (TextView) findViewById(R.id.rightHeader);

    LayoutParams leftHeaderLayoutParams = leftHeader.getLayoutParams();
    LayoutParams rightHeaderLayoutParams = rightHeader.getLayoutParams();

    TableLayout contentTable = (TableLayout) findViewById(R.id.maintable);      

    contentTable.removeAllViews();

    for (int i = list.size() - 1; i >= 0; i--) {

        TextView tv1 = new TextView(this);
        tv1.setTextColor(Color.BLACK);
        tv1.setGravity(Gravity.CENTER);
        tv1.setBackgroundColor(Color.LTGRAY);
        tv1.setLayoutParams(leftHeaderLayoutParams);
        tv1.setText(String.valueOf(list.get(i).getLevel()));

        TextView tv2 = new TextView(this);
        tv2.setTextColor(Color.BLACK);
        tv2.setGravity(Gravity.CENTER);
        tv2.setBackgroundColor(Color.WHITE);
        tv2.setLayoutParams(rightHeaderLayoutParams);
        tv2.setText(list.get(i).getDurationTimeInString());

        TableRow tblRow = new TableRow(this);
        tblRow.addView(tv1);
        tblRow.addView(tv2);

        contentTable.addView(tblRow);                   
    }       
}

在我使用removeAllViews或任何addView函数后,最顶层表的布局会发生变化,如前所述。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您可以通过将android:layout_width="30dip"android:layout_width="70dip"中的leftHeaderrightHeader以及android:layout_width="fill_parent"更改为<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:addStatesFromChildren="false" android:layout_height="wrap_content"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:id="@+id/header"> <TextView android:id="@+id/leftHeader" android:textColor="@android:color/black" android:layout_margin="1dp" android:gravity="center_horizontal" android:layout_weight="1" android:background="#ffcccccc" android:text="textview1" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/rightHeader" android:textColor="@android:color/black" android:gravity="center_horizontal" android:layout_weight="1" android:layout_margin="1dp" android:background="@android:color/white" android:text="textview2" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:id="@+id/buttonTable" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:color/black" android:layout_alignParentBottom="true" > <Button android:id="@+id/button_ResetData" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Reset Data" android:layout_gravity="center" android:layout_weight="1" /> <Button android:id="@+id/button_Refresh" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Refresh" android:gravity="center" android:layout_weight="1" /> </LinearLayout> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:fadingEdge="none" android:layout_below="@id/header" android:layout_above="@id/buttonTable"> </ListView> 来解决此问题。我不得不承认,我并不完全确定为什么会这样。

不是每次都清除并重新填充TableLayout,您可能需要考虑使用ListAdapter。它更适合你正在做的事情(也可能会表现得更好)。

更新号码2:

注意main.xml中的更改以及onCreate方法的更改。这将使您的标题保持静态,同时让列表视图滚动,并且从按钮的TableLayout更改为LinearLayout将解决对齐问题。

以下是如何使用自定义适配器而不是TableLayout(这对于像这样的动态数据真正意义)来实现此目的:

将main.xml更改为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="wrap_content">
    <TextView android:id="@+id/maintableLeft"
        android:layout_height="wrap_content" android:layout_weight="1"
        android:layout_marginRight="1dp" android:layout_marginLeft="1dp"
        android:gravity="center_horizontal" android:background="#ffcccccc"
        android:textColor="@android:color/black" android:layout_width="fill_parent" />
    <TextView android:id="@+id/maintableRight"
        android:layout_height="wrap_content" android:background="#ffcccccc"
        android:textColor="@android:color/black" android:layout_weight="1"
        android:layout_marginLeft="1dp" android:layout_marginRight="1dp"
        android:gravity="center_horizontal" android:layout_width="fill_parent" />
</LinearLayout>

为您的行添加XML布局文件(row.xml):

class CustomAdapter extends BaseAdapter {
    private List<BatteryInfo> info;
    private LayoutInflater inflater;

    public CustomAdapter(Context context, List<BatteryInfo> x) {
        this.info = x;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return info.size();
    }

    public Object getItem(int position) {
        return info.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v;
        v = inflater.inflate(R.layout.row, parent, false);

        BatteryInfo b = (BatteryInfo) getItem(position);

        ((TextView) v.findViewById(R.id.maintableLeft)).setText(b
                .getDurationTimeInString());
        ((TextView) v.findViewById(R.id.maintableRight)).setText(b
                .getLevel());

        return v;
    }
}

现在一切都准备好从BaseAdapter创建自定义类来显示您的信息(并使您的布局更好地工作):

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

    final ListView lv = (ListView) this.findViewById(R.id.listView);
    final Context context = this;

    Button refresh = (Button) this.findViewById(R.id.button_Refresh);
    refresh.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            List<BatteryInfo> x = new ArrayList<BatteryInfo>();
            x.add(new BatteryInfo());
            x.add(new BatteryInfo());
            x.add(new BatteryInfo());
            x.add(new BatteryInfo());


            lv.setAdapter(new CustomAdapter(context, x));
        }
    });
}

修改onCreate方法以扩充标题,添加标题,然后使用新的CustomAdapter将数据绑定到ListView(我已为此示例创建了一个假的BatteryInfo类,您需要修改稍微努力使这个工作):

{{1}}