ProgressDialog устарел

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

Кажется, индикатор выполнения будет работать, но все еще не работает. Мне нужен диалог прогресса, потому что мне просто легко установить свой заголовок и сообщение. Мне нужен счетчик progressDialog, но я не знаю, как это сделать. Вот одна из моих работ, но не реализованная:

Класс Java

ublic class SaveVideo extends AppCompatActivity {

private Button button;

private ProgressDialog mProgressDialog;

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

    mProgressDialog = new ProgressDialog(this);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.back);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    button = (Button) findViewById(R.id.saveVideo);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //where it must be seen when the button is pressed
            mProgressDialog.setTitle("Title");
            mProgressDialog.setMessage("Message");
            mProgressDialog.show();

            Intent intent = new Intent(SaveVideo.this,MainActivity.class);
            intent.putExtra("change",2);
            startActivity(intent);

            //as soon as the page moves from this to another fragment
            mProgressDialog.dismiss();
        }
    });


}

Я новичок в Android версии O. Любая помощь даст мне новые знания!


person Alok    schedule 27.07.2017    source источник
comment
Когда вы используете progresBar, progressBar не отображается?   -  person Bruno Ferreira    schedule 27.07.2017
comment
нет! Я сделал то же самое, только вместо этого использовал progressBar. Я сделал setVisibility(View.VISIBILE) и setVisibility(View.INVISIBLE) для того же, но без знака.   -  person Alok    schedule 27.07.2017
comment
Можете ли вы опубликовать код входа?   -  person Bruno Ferreira    schedule 27.07.2017
comment
У меня нет кода входа. Просто я перехожу от этой деятельности к фрагменту. Что занимает немного времени. Поэтому я думал реализовать progressDialog   -  person Alok    schedule 27.07.2017
comment
Проблема @Alok заключалась в вызове метода отклонения () сразу после начала отправки намерения. Диалоговое окно будет появляться и исчезать очень быстро, что, с точки зрения пользователя, может показаться, что оно никогда не появлялось. Ответы о том, что он устарел или внедрить настраиваемый диалог, не помогают, особенно ответы о создании настраиваемого диалога, потому что они не только не говорят о реальной проблеме, но и не помогают с проблемой удобства использования, которая это причина, по которой этот класс устарел в первую очередь.   -  person LeonardoSibela    schedule 16.04.2019


Ответы (9)


Как упоминается в документации Android O:

Этот класс устарел на уровне API 26. ProgressDialog — это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложением. Вместо этого класса вам следует использовать индикатор выполнения, такой как ProgressBar, который можно встроить в пользовательский интерфейс вашего приложения. Кроме того, вы можете использовать уведомление, чтобы информировать пользователя о ходе выполнения задачи.

Вы можете создать собственное представление с помощью TextView и ProgressBar и управлять его видимостью. Вы можете использовать эту библиотеку еще и потому, что она использует AlertDialog вместо ProgressDialog.

person Divy Soni    schedule 27.07.2017
comment
вы верите, что это сработает, если мне нужна полоса прогресса, как у progressDialog. Заголовок и другие сообщения? появляется индикатор выполнения, когда мы переходим от активности к фрагменту? - person Alok; 27.07.2017
comment
Я использовал эту библиотеку, но то, что она сказала, не работает, как AlertDialog alertdialog = new SpotsDialog(context); это дает мне ошибку, и я изменил его на SpotsDailog из AlertDialog, и все равно он не отображается. Поскольку я просто обычно перехожу от одного действия к другому без индикатора прогресса! - person Alok; 27.07.2017
comment
Круто, братан :) Это сработало для меня, большое спасибо за это :) - person Swifty Codes; 27.07.2017
comment
You can use this library also because it is using AlertDialog instead of ProgressDialog использовать другой тип диалога - плохая идея, документ говорит you should use a progress indicator like ProgressBar, which can be embedded in your app's UI - person vuhung3990; 17.07.2018

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

layout_loading_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">
    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

следующий шаг - создать AlertDialog, который покажет этот макет с помощью ProgressBar.

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

теперь все, что осталось, это показать и скрыть этот диалог в наших событиях щелчка, как это

progress_dialog.show(); // to show this dialog
progress_dialog.dismiss(); // to hide this dialog

и это все, это должно работать, как вы можете видеть, довольно просто и легко реализовать ProgressBar (например, ProgressDialog) вместо устаревшего ProgressDialog. теперь вы можете показать/закрыть это диалоговое окно либо в обработчике, либо в ASyncTask, это зависит от ваших потребностей, надеюсь, вы сможете использовать это для решения своих проблем, ура

person Syed Naeem    schedule 05.08.2018

Да, API level 26 это устарело, лучше использовать только progressbar.

Используйте этот фрагмент кода для программного создания:

ProgressBar progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall);

На всякий случай измените android.R.attr.progressBarStyleSmall на android.R.attr.progressBarStyleHorizontal.

Возможно, вам поможет это руководство. .

Я надеюсь, что это может помочь вам.

person Gowthaman M    schedule 19.08.2017
comment
дополнительная ссылка stackoverflow.com/questions/45373007/ - person Gowthaman M; 31.10.2017

Этот класс устарел на уровне API 26.

ProgressDialog — это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложением. Вместо этого класса вам следует использовать индикатор выполнения, такой как ProgressBar, который можно встроить в пользовательский интерфейс вашего приложения. Кроме того, вы можете использовать уведомление, чтобы информировать пользователя о ходе выполнения задачи.

https://developer.android.com/reference/android/app/ProgressDialog.html

person Mayur Prasad    schedule 08.09.2017

Вам нужно создать собственный XML-файл макета с ProgressBar и показать его вместо этого. Я использовал такую ​​библиотеку, как https://github.com/Q115/DelayedProgressDialog, чтобы получить это простое поведение.

Использование:

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
person NinjaCowgirl    schedule 17.09.2017

Вы можете использовать ProgressBar вместо ProgressDialog. Создайте ProgressBar внутри пользовательского диалога с TextView и другими необходимыми виджетами.

person Milad Moosavi    schedule 01.08.2017

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

Мой случай был простым, потому что мне просто нужен был неопределенный индикатор выполнения. Для полноценной версии вам придется инкапсулировать ее в класс и получить доступ к панели.

private AlertDialog Create_Indeterminate_HorizontalProgressBar_AlertDialog(
        Context context, String title, String message)
{
    final ProgressBar progressBar =
            new ProgressBar(
                    context,
                    null,
                    android.R.attr.progressBarStyleHorizontal);

    progressBar.setLayoutParams(
            new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT));

    progressBar.setIndeterminate(true);

    final LinearLayout container =
            new LinearLayout(context);

    container.addView(progressBar);

    int padding =
            getDialogPadding(context);

    container.setPadding(
            padding, (message == null ? padding : 0), padding, 0);

    AlertDialog.Builder builder =
            new AlertDialog.Builder(context).
                    setTitle(title).
                    setMessage(message).
                    setView(container);

    return builder.create();
}

private int getDialogPadding(Context context)
{
    int[] sizeAttr = new int[] { android.support.v7.appcompat.R.attr.dialogPreferredPadding };
    TypedArray a = context.obtainStyledAttributes((new TypedValue()).data, sizeAttr);
    int size = a.getDimensionPixelSize(0, -1);
    a.recycle();

    return size;
}

Примечание. Если вам интересно, почему Bar находится в контейнере: я просто не мог заставить отступы работать с Bar, вместо этого вставляя его в контейнер.

person Nublodeveloper    schedule 02.03.2018

Это то, что мне удалось собрать, так как класс устарел в Android Oreo (API 26+).

В файле Xml (любой файл макета):

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
            android:visibility="gone"
            android:layout_marginTop="5dp"
            android:id="@+id/top_progressBar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:layout_height="wrap_content"
            android:indeterminateTintMode="src_in"
            android:indeterminateTint="@color/white"
            android:indeterminate="true" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />
  <ProgressBar
                android:visibility="gone"
                android:layout_marginTop="2dp"
                android:id="@+id/down_progressBar"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                android:layout_width="match_parent"
                android:layout_marginRight="10dp"
                android:layout_marginLeft="10dp"
                android:layout_height="wrap_content"
                android:indeterminateTintMode="src_in"
                android:indeterminateTint="@color/white"
                android:indeterminate="true" />

</LinearLayout>

в приведенном выше примере я подумал о ситуации прокрутки, говоря, что ваш вид длинный, поэтому два индикатора выполнения.

в примере файла Java:

public class GetUserDetails extends AppCompatActivity {
private ProgressBar topProgressBar, downProgressBar;
    private ProgressDialog progressDialog;
@Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_get_user_details );
//initilise the progressbar views and progress dialog object
 topProgressBar = findViewById ( R.id.top_progressBar );
    downProgressBar = findViewById ( R.id.down_progressBar );
  if ( Build.VERSION.SDK_INT < 26 ) {
        progressDialog = new ProgressDialog ( this );
    } else {
        topProgressBar.setIndeterminate ( true );
        downProgressBar.setIndeterminate ( true );
    }
 }



    private void showProgressDialog (final boolean isToShow) {
            if ( Build.VERSION.SDK_INT < 26 ) {
                if ( isToShow ) {

                    progressDialog.setMessage ( "Processing ...Please wait." );
                    progressDialog.setCancelable ( false );
                    if ( ! progressDialog.isShowing () ) {
                        progressDialog.show ();

                    }

                } else {
                    if ( progressDialog.isShowing () ) {
                        progressDialog.dismiss ();
                    }
                }
            } else {
                /* this is Android Oreo and above*/
                if ( isToShow ) {
                    topProgressBar.setVisibility ( View.VISIBLE );
                    downProgressBar.setVisibility ( View.VISIBLE );
                    getWindow ().setFlags ( WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE );
                } else {
                    topProgressBar.setVisibility ( View.GONE );
                    downProgressBar.setVisibility ( View.GONE );
                    getWindow ().clearFlags ( WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE );
                }
            }
        }

}

Что ж, это мой хак, так что я надеюсь, что он поможет.

person kinsley kajiva    schedule 14.12.2017

ProgressDialog в вашем примере никогда не будет виден, потому что вы вызываете dismiss() сразу после show(). Создание Intent и вызов startActivity() не блокируются: в основном вы просто планируете переключение на другое действие, которое будет выполнено "в ближайшее время".

Вы должны переместить вызов dismiss() в свою активность onStop:

@Override
protected void onStop()
{
    super.onStop();
    mProgressDialog.dismiss();
}

Кроме того, можно спросить: почему в этом случае переключение с одного вида деятельности на другой занимает так много времени? Я предполагаю, что ваша MainActivity выполняет тяжелую работу в своих методах onCreate/onStart/onResume. Лучший способ справиться с этим может состоять в том, чтобы поместить всю эту работу в отдельный поток.

person Robin    schedule 18.09.2017