С FrameLayout в качестве корневого макета, добавьте вид поверх другого, со смещением X, Y - PullRequest
0 голосов
/ 30 сентября 2018

Я бы хотел разместить вид поверх существующего.Представление, на которое я нацеливаюсь, находится внутри LinearLayout, который находится в FrameLayout.

Я думаю, что есть способ сделать это с RelativeLayout, потому что он уже частично работает.Я хотел бы выровнять новый вид с левым нижним или верхним левым (как начало координат), а затем сместить X и Y к некоторому точному значению, которое я указываю.

Как этого достичь?

Вот идея:

public static void placeTextRelativeToBottomLeftOfViewAtXY(final FrameLayout layout, View component, int x, int y, String text) {

    final TextView textView = new TextView(getContext());
    textView.setId((int)System.currentTimeMillis());
    final RelativeLayout relativeLayout = new RelativeLayout(getContext());
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    params.setMargins(x, y, 0,0);
    params.addRule(RelativeLayout.LEFT_OF, component.getId());
    relativeLayout.setLayoutParams(params);
    relativeLayout.setBackgroundColor(Color.TRANSPARENT);
    textView.setText("+500 points!");
    textView.bringToFront();
    relativeLayout.addView(textView, params);
    layout.addView(relativeLayout);
}

1 Ответ

0 голосов
/ 30 сентября 2018

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

Можно пойти путем выравнивания иерархии макетов, установив кореньмакет на RelativeLayout или ConstraintLayout.

ConstraintLayout более гибок с точки зрения позиционирования видов, но его также сложнее освоить.

Здесь я оставляюАльтернатива для использования с RelativeLayout в качестве корневого представления.Важными элементами, на которые следует обратить внимание, является параметр LayoutParams, который иногда немного сбивает с толку.
LayoutParams установлен на дочернем представлении, но используемый класс зависит от родительского представления.

Также имейте в виду, что для сохранения независимости полей необходимо конвертировать dp в пиксели (для простоты я этого не делал, но есть примеры того, как это сделать здесь, в SO).

Он также использует View.generteViewId() иди и получите идентификатор для динамически создаваемого представления.

Для простоты я включил ссылку View в xml, но я мог бы также быть создан динамически.

Макет

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvCenterText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Texto estatico"
        android:layout_centerInParent="true"/>

</RelativeLayout>

Основная деятельность

public class DynamicViewsActivity extends AppCompatActivity {

    RelativeLayout rlContainer;
    TextView centerText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamicviews);

        rlContainer = findViewById(R.id.rlContainer);

        centerText = findViewById(R.id.tvCenterText);


        placeTextRelativeToBottomLeftOfViewAtXY(rlContainer, centerText, 100,10, "Hola");

    }

    public void placeTextRelativeToBottomLeftOfViewAtXY(final RelativeLayout layout, View component, int x, int y, String text) {

        final TextView textView = new TextView(this);
        textView.setId(View.generateViewId());
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(x, y, x,y);
        params.addRule(RelativeLayout.LEFT_OF, component.getId());
        params.addRule(RelativeLayout.ALIGN_BASELINE, component.getId());
        textView.setLayoutParams(params);
        textView.setText(text);
        layout.addView(textView);
    }
}
...