изменение места кнопки с помощью функции компоновки в абсолютной компоновке

#android #layout #button #positioning #css-position

#Android #макет #кнопка #позиционирование #css-position

Вопрос:

Я пытаюсь расположить кнопку в другом месте, используя абсолютный макет. Я использую следующий XML-файл:

 <?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:background="@drawable/bcgrd">
  <Button
    android:id="@ id/start_challenge"
    android:textStyle="bold"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text = "Start Challenge"
    android:textColor= "@color/light_gray"
    android:background="@color/background">
    </Button>  
</AbsoluteLayout>
  

файл Java содержит следующий код:

     Button start_it = (Button)findViewById(R.id.start_challenge);
    start_it.layout(200, 200, 200, 200);
  

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

Заранее спасибо.

Ответ №1:

Что вы делаете неправильно, так это используете AbsoluteLayout. 🙂 Серьезно, вам действительно не стоит это использовать; попробуйте вместо этого использовать FrameLayout.

Однако, чтобы ответить на ваш вопрос, вы не должны вызывать layout на нем, сделайте это вместо этого:

 AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams)start_it.getLayoutParams();
params.x = 200;
params.y = 200;
start_it.setLayoutParams(params);
  

Или с меньшим количеством кода, вы могли бы сделать это вместо:

 start_it.setLayoutParams(new AbsoluteLayout.LayoutParams(
    start_it.getWidth(), start_it.getHeight(), 200, 200));
  

Комментарии:

1. не могли бы вы пояснить, почему мы не должны использовать. функция макета @kcoppock

2. @MuhammadBabar AbsoluteLayout устарел и плохо поддерживает несколько размеров экрана.

3. Ну, я задал кое-что другое, но теперь я решил проблему, проблема заключалась в том, что я использовал layout(int left, int top, int right, int bottom) функцию, которую мы НИКОГДА не должны использовать, потому что фреймворк может вызывать эту функцию всякий раз, когда представление становится недействительным (обновить) и перемещает его, мы должны использовать LayoutParams для любого изменения положения / размера представления

4. Да, вы должны использовать только layout() изнутри onLayout() (если вы пишете пользовательский ViewGroup ).