View.layout () работает до следующего обновления пользовательского интерфейса - PullRequest
1 голос
/ 31 января 2012

Моя деятельность по запуску состоит из линейного макета с двумя кнопками. Обе кнопки имеют слушателей: первая (b) перемещается сама по нажатию: 30 пикселей влево и 30 пикселей назад при следующем щелчке. Второй (b2) меняет свой текст при нажатии. Вот код:

public class TestActivity extends Activity {
public final String TAG="TestActivity";
boolean toTop=true;
boolean setInitialText=false;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); 
    Button b=(Button)findViewById(R.id.button);
    Button b2=(Button)findViewById(R.id.button2);
    b.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            int modifier;
            if(toTop) modifier=-30; 
            else modifier=30;
            v.layout(v.getLeft()+modifier,v.getTop(),v.getRight()+modifier,v.getBottom());
            toTop=!toTop;
        }
    });

    b2.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            String currentText;
            if(setInitialText)currentText="Press to change text";
            else currentText="Press to change back";
            ((Button)v).setText(currentText);
            setInitialText=!setInitialText;
        }
    });
}
}

XML-файл макета:

<?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="match_parent"
android:gravity="center"
android:orientation="vertical" >
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Press to begin animation" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Press to change text" />

Моя проблема: когда b перемещается влево и я нажимаю b2, b перемещается в исходное положение. Зачем? Я не хочу, чтобы это вернулось назад и нигде не указывалось.

Похоже, View.layout теряет свой эффект. Почему так происходит? Я проверял это в других ситуациях, и кажется, что любое обновление пользовательского интерфейса приводит к тому, что все вызванные методы View.layout теряют свое действие.

В моем основном проекте есть ListView, который заполняется изображениями из фона - все представления теряют эффект, когда появляется новое изображение. Кроме того, если я добавлю EditText и попытаюсь ввести что-то (как пользователь), представление также потеряет свой эффект. Может кто-нибудь объяснить мне, что происходит и почему взгляды возвращаются назад?

Ответы [ 2 ]

0 голосов
/ 01 июля 2012

Здесь говорит, что эту проблему можно решить, используя view.setLayoutParams() вместо view.layout()

0 голосов
/ 31 января 2012

Похоже, что родительский макет перемещает своих братьев и сестер после установки нового текста для button2, потому что, как описано в xml, button2 переносит его содержимое по ширине и высоте.

Когда вы изменили содержимое кнопки, она запрашивает родительский макет, чтобы получить новую позицию для нее. В этом случае родительский макет пересчитает значения позиции для всех своих братьев и сестер. Вот почему button1 также возвращается на прежнюю позицию.

Имейте в виду, что вы также устанавливаете значение силы тяжести для родительского макета как center, это означает, что, когда макет будет располагать своих братьев и сестер, он будет размещать их в своем центре.

Попробуйте поэкспериментировать с некоторыми другими классами макетов, такими как FrameLayout, который имеет абсолютную манеру позиционирования своих братьев и сестер, и RelativeLayout, который также пробует ваш случай избавиться от гравитации макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...