Как получить кнопки для отображения активности на картах

#android #android-layout

Вопрос:

Я пробовал около 5 различных способов, чтобы попытаться заставить кнопки отображаться поверх действия с картами, но, что бы я ни пытался, я не могу заставить их отображаться, кто-нибудь знает, что я делаю не так? Это относится к Android studio

Вот код из activity_maps.xml

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/currentloca"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:backgroundTint="#818181"
android:orientation="vertical"
android:visibility="visible">

<fragment
    android:id="@ id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="553dp"
    tools:context=".MapsActivity" />

<androidx.appcompat.widget.LinearLayoutCompat
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="horizontal">

<Button
        android:id="@ id/zoomin"
        android:layout_width="205dp"
        android:layout_height="wrap_content"
        android:onClick="onZoom"
        android:text="Zoom In" />

    <Button
        android:id="@ id/zoomout"
        android:layout_width="205dp"
        android:layout_height="wrap_content"
        android:onClick="onZoom"
        android:text="Zoom Out" />


</androidx.appcompat.widget.LinearLayoutCompat>

</FrameLayout>
 

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

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

2. Я думаю, вам следует протестировать свой макет с помощью какого-нибудь макетного фрагмента, отличного от фрагмента SupportMapFragment.

Ответ №1:

Как было предложено в комментарии, я думаю, что вам нужна относительная компоновка. Вот вам пример.

 <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


       <fragment
        android:id="@ id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="553dp"
        tools:context=".MapsActivity" />

         <LinearLayout
             android:layout_alignParentTop="true"
             android:layout_alignParentStart="true"
             android:layout_alignParentLeft="true"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content">

               <Button />
               <Button />

         </LinearLayout>
</RelativeLayout>
 

Таким образом, кнопки будут отображаться в верхней части фрагмента карты.

Ответ №2:

Вы должны использовать FrameLayout или его разновидность вместо LinearLayout этого . Ниже просто показана структура для объяснения:

 <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <Button />
        <Button />
    
    </LinearLayout>

</FrameLayout>
 

LinearLayout размещает свои дочерние представления на горизонтальной или вертикальной линии. В то время FrameLayout как перерождает своих детей.

Что касается вашего фактического кода, сначала замените (перезапишите) окружающий (самый внешний) LinearLayout :

 <LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/currentloca"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:backgroundTint="#818181"
android:orientation="vertical"
android:visibility="visible">

(...)

</LinearLayout>
 

с FrameLayout :

 <FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/currentloca"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:backgroundTint="#818181"
android:orientation="vertical"
android:visibility="visible">

(...)

</FrameLayout>
 

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

1. @Newtz Попробуйте изменить окружающий линейный вывод на фреймовый.

2. Я не могу опубликовать новый измененный код здесь из-за макс. символов комментариев

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

4. @Newtz изменение вашего кода было не тем, что я предполагал. Я обновил свой пост.

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

Ответ №3:

Удалите первого родителя LinearLayout из своего кода. Обновленный код должен выглядеть так.

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/currentloca"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:backgroundTint="#818181"
    android:orientation="vertical"
    android:visibility="visible">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="555dp">

        <fragment
            android:id="@ id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="553dp"
            tools:context=".MapsActivity" />

        <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="horizontal">

            <Button
                android:id="@ id/zoomin"
                android:layout_width="205dp"
                android:layout_height="wrap_content"
                android:onClick="onZoom"
                android:text="Zoom In" />

            <Button
                android:id="@ id/zoomout"
                android:layout_width="205dp"
                android:layout_height="wrap_content"
                android:onClick="onZoom"
                android:text="Zoom Out" />


        </androidx.appcompat.widget.LinearLayoutCompat>
    </FrameLayout>

</RelativeLayout>
 

Если вы хотите, чтобы ваши представления потенциально перекрывались, используйте a FrameLayout . Если вы хотите, чтобы они отображались линейно, используйте LinearLayout

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

1. Я обновляю свой код в исходном сообщении. Это все еще не работает @nitish chaudhary

2. @Newtz , я полагаю, что вы не хотите показывать карты на весь экран в виде фрагмента карты с фиксированной высотой 555dp. Если вы хотите , чтобы карты отображались на весь экран, замените высоту карт на match_parent. Но если это то , что вам нужно, я обновил код для настройки кнопок в нижней части карты. В этом случае нижняя часть экрана будет белой(пустой) для больших устройств.

3. Я пробовал разные устройства, но ничего не изменилось. У меня никогда не было столько проблем

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

Ответ №4:

Ну, вы должны использовать ConstriantLayout и LinearLayout.

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Activities.Maps">

    <fragment
        android:id="@ id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="horizontal"
        map:layout_constraintEnd_toEndOf="parent"
        map:layout_constraintStart_toStartOf="parent"
        map:layout_constraintTop_toTopOf="parent">

        <Button
            android:id="@ id/zoomin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:onClick="onZoom"
            android:text="Zoom In" />

        <Button
            android:id="@ id/zoomout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:onClick="onZoom"
            android:text="Zoom Out" />


    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
 

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

1. Я попробовал это, и в разделе мои инструменты:контекст выдает мне красную ошибку. Также при запуске кода он тоже не работает. На самом деле ни один из комментариев не сработал и даже не изменил само приложение. Он показывает это в части дизайна, но в реальном приложении он не показывает кнопки выше или какие-либо изменения вообще