android -> относительная компоновка кнопки изменения выравнивания текста при нажатии - PullRequest
1 голос
/ 17 июля 2011

Это мой 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 Ответ

1 голос
/ 25 июля 2011

Вы можете исправить это, изменив android:layout_width="30dip" и android:layout_width="70dip" в leftHeader и rightHeader на android:layout_width="fill_parent".Я должен признать, что я не совсем уверен, почему это так.

Вместо очистки и повторного заполнения TableLayout каждый раз, однако, вы можете рассмотреть возможность использования ListAdapter .Это гораздо больше подходит для того, что вы делаете (и, вероятно, будет работать лучше).

ОБНОВЛЕНИЕ НОМЕР 2:

Обратите внимание на изменение в main.xml и изменениев методе onCreate.Это сделает ваш заголовок статичным, в то время как позволяет прокрутить просмотр списка, а переход с TableLayout на LinearLayout для ваших кнопок решит проблему с выравниванием.на самом деле не предназначен для таких динамических данных):

Измените ваш 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">

<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>

Добавьте файлы макета XML для ваших строк (строка.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>

Теперь все готово для создания пользовательского класса из BaseAdapter для отображения вашей информации (и улучшения работы макета):

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;
    }
}

Измените свой onCreateметод, чтобы надуть заголовок, добавить его, а затем привязать ваши данные к вашему ListView с помощью нового CustomAdapter (для этого примера я создал фальшивый класс BatteryInfo, вам нужно немного изменить вещи, чтобы это работало):

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));
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...