2012-01-31 7 views
1

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

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

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

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

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

ответ

0

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

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

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

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

0

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

Смежные вопросы