Ширина пользовательского Alertdialog больше показанной ширины в макете XML - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать собственный алерталдиалог. Вот мой алертиддиалог по пользовательской раскладке xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center"
    android:orientation="horizontal">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Processing" />
</LinearLayout>
</RelativeLayout>

и код активности, где я звоню по адресу custom alertialialog

   LayoutInflater inflater = MainActivity.this.getLayoutInflater();
   View dialogView = inflater.inflate(R.layout.layoutalertprogress, null);
   AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
   alertDialogBuilder.setView(dialogView);
   alertDialog = alertDialogBuilder.create();
    if(!alertDialog.isShowing())
      {
           alertDialog.show();
      }

проблема в том, что даже в файле макета ширина линейного слоя переносится в его содержимое следующим образом layout demo

реальная ширина alerttdialog выглядит так во время выполнения enter image description here таким образом, реальная ширина alerttdialog шире (шире, чем схема, показанная выше). Кажется, что ширина линейного размещения не ограничена его содержимым, поэтому существует большое неиспользуемое пространство от его краев до дочерних элементов. Как сделать так, чтобы эта ширина линейного макета обернула содержимое, чтобы неиспользуемое пространство с его краев можно было удалить? Благодаря

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Я столкнулся с той же проблемой, и решение, которое у меня сработало:

Создайте тему со следующим:

<style name="yourThemeName" parent="Theme.AppCompat.Dialog">
       ...
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

А потом в коде:

 inflatedView= layoutInflater.inflate(R.layout.yourLayoutId, null)
  dialog = AlertDialog.Builder(this, R.style.yourThemeName)
            .setView(inflatedView)
  dialog.show()
0 голосов
/ 02 ноября 2018

измените свой относительный макет, как показано ниже

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center"
    android:orientation="horizontal">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Processing" />
</LinearLayout>
</LinearLayout>

Создайте тему для alerttdialog в style.xml, как показано ниже

<style name="AlertDialogCustom" parent="AlertDialog.AppCompat">
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
        <item name="android:textSize">10sp</item>
        <item name="android:layout_width">wrap_content</item>
</style>

Создайте ниже метод для вызова вашего диалога.

public void showDemoDialog() {
        LayoutInflater inflater = MainActivity.this.getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.demodg, null);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogCustom);
        alertDialogBuilder.setView(dialogView);
        AlertDialog alertDialog = alertDialogBuilder.create();
        if (!alertDialog.isShowing()) {
            alertDialog.show();
            alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        }

    }

Это результат при запуске на устройстве. enter image description here

0 голосов
/ 02 ноября 2018

Попробуйте это

установить цвет фона на дочерний LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:background="@android:color/white"
        android:orientation="horizontal">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Processing" />
    </LinearLayout>
</RelativeLayout>

и затем добавьте эту строку в свой код Java

 alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

после этого

AlertDialog alertDialog = alertDialogBuilder.create();
0 голосов
/ 02 ноября 2018
  LayoutInflater inflater = MainActivity.this.getLayoutInflater();
                View dialogView = inflater.inflate(R.layout.layoutalertprogress, null);
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
                alertDialogBuilder.setView(dialogView);
                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00000000")));
                if(!alertDialog.isShowing())
                {
                    alertDialog.show();
                }
...