Пользовательский диалог расширяет диалог не рендеринг макета по OnCreate выполняется - PullRequest
1 голос
/ 07 января 2020

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

Проблема в том, что Android не отображает макет, хотя я устанавливаю макет с помощью setContentView () .

Пример вызова .show () :

Example Problem

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

Кодовые файлы ниже:

Исходный файл ProgressDialog. java

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;

import com.example.android.R;

public class ProgressDialog extends Dialog {

    private ProgressBar progressBar;
    private TextView textView;

    public ProgressDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.progress_dialog);
        progressBar = findViewById(R.id.progressBarDialog);
        progressBar.setProgress(0);
        textView = findViewById(R.id.progressBarText);
    }

    public void setProgress(int progress){
        if (progressBar != null) {
            progressBar.setProgress(progress);
        }
    }

    public void setText(String text){
        if (textView != null) {
            textView.setText(text);
        }
    }
}

и с progress_dialog. xml макет выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/progressBarText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ProgressBar
        android:id="@+id/progressBarDialog"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBarText" />
</androidx.constraintlayout.widget.ConstraintLayout>

В чем причина этой проблемы, почему Android не отображает содержимое диалога?

Обновление с Комментарий @ md-asaduzzaman

Как использовать:

ProgressDialog dialog = new ProgressDialog (SomeActivityHere.this);
dialog.show();

// optional
dialog.setProgress(0);
dialog.setText(getString(R.string.someString));

В качестве альтернативы можно передать набор аргументов

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Это проблема вашего layout. Измените layout_width вашего взгляда с 0dp на wrap_content или match_parent или на любой другой фиксированный размер согласно вашему требованию mnet.

android:layout_width="wrap_content"

Рядом с ваш диалог не работает должным образом, поскольку setProgress и setText выполняются до создания диалогового окна. Итак, измените реализацию диалога, как показано ниже:

public class ProgressDialog extends Dialog {

    private ProgressBar progressBar;
    private TextView textView;

    private String mText;
    private int mProgress;


    public ProgressDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.progress_dialog);
        progressBar = findViewById(R.id.progressBarDialog);
        progressBar.setProgress(mProgress);

        textView = findViewById(R.id.progressBarText);
        textView.setText(mText);
    }

    public void setProgress(int progress){
        mProgress = progress;

        if (progressBar != null) {
            progressBar.setProgress(mProgress);
        }
    }

    public void setText(String text){
        mText = text;

        if (textView != null) {
            textView.setText(mText);
        }
    }
}

Вывод:

enter image description here

0 голосов
/ 07 января 2020

Проблема в android: layout_width = "0dp" изменить его на определенный размер, например 100dp или сопоставить родительский

    <TextView
        android:id="@+id/progressBarText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ProgressBar
        android:id="@+id/progressBarDialog"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBarText" />
      </androidx.constraintlayout.widget.ConstraintLayout>
0 голосов
/ 07 января 2020

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

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="200dp"
    android:layout_height="200dp"
    >

  <TextView
      android:id="@+id/progressBarText"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="16dp"
      android:layout_marginLeft="16dp"
      android:layout_marginTop="16dp"
      android:layout_marginEnd="16dp"
      android:layout_marginRight="16dp"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      />

  <ProgressBar
      android:id="@+id/progressBarDialog"
      style="?android:attr/progressBarStyleHorizontal"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="16dp"
      android:layout_marginLeft="16dp"
      android:layout_marginTop="8dp"
      android:layout_marginEnd="16dp"
      android:layout_marginRight="16dp"
      android:layout_marginBottom="16dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/progressBarText"
      />
</androidx.constraintlayout.widget.ConstraintLayout>

Также:

ProgressDialog dialog = new ProgressDialog(this);
    dialog.show();

    // optional
    dialog.setProgress(0);
    dialog.setText("testing");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...