2017-07-27 24 views
6

Ponieważ ProgressDialog jest przestarzałe w wersji O systemu Android, wciąż znajduję lepszy sposób na wykonanie mojego zadania. Zadanie polega na przejściu z mojej aktywności do fragmentu. Wszystko działa dobrze, ale progressdialog nie jest widoczny. Próbowałem go wdrożyć, ale ... progressdialog nie działa.ProgressDialog jest przestarzałe

Wygląda na to, że pasek postępu będzie działał, ale nadal nie działa. Potrzebuję progressdialog, ponieważ jest mi łatwo ustawić tytuł i wiadomość. Potrzebuję spinner progressDialog, ale nie wiem jak to zrobić. Oto jeden z moich prac, ale nie wykonawcze:

Java Class

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(); 
     } 
    }); 


} 

Jestem nowy android O. Każda pomoc da mi coś nowego do nauki!

+0

Podczas korzystania z progresBar, pasek postępu nie jest wyświetlany? –

+0

nopes! Zrobiłem to samo, po prostu skorzystałem z paska postępu. Zrobiłem setVisibility (View.VISIBILE) i setVisibility (View.INVIEWIBLE) dla tego samego, ale bez znaku. – Alok

+0

Czy możesz umieścić kod w kodzie? –

Odpowiedz

9

Jak wspomniano Android dokumentacji O:

Klasa ta została zaniechana poziomu API 26. ProgressDialog jest modalne okno, co uniemożliwia użytkownikowi interakcję z aplikacji. Zamiast tego należy używać wskaźnika postępu, takiego jak ProgressBar, który można osadzić w interfejsie użytkownika aplikacji. Alternatywnie, możesz użyć powiadomienia, aby poinformować użytkownika o postępie zadania.

Możesz stworzyć własny widok z TextView i ProgressBar i zarządzać jego widocznością. Możesz użyć this library również dlatego, że używa AlertDialog zamiast ProgressDialog.

+0

Czy uważasz, że będzie działać, jeśli chcę progressive pasek postępu, podobnie jak progressDialog. Tytuł i inne wiadomości? czy pasek postępu pojawia się, gdy przechodzimy od atakcji do fragmentu? – Alok

+0

Użyłem tej biblioteki, ale to, co powiedział, nie działa tak jak AlertDialog alertdialog = new SpotsDialog (context); to daje mi błąd i zmieniłem go na SpotsDailog z AlertDialog i nadal się nie wyświetla. Ponieważ normalnie przechodzę od jednej czynności do drugiej bez żadnego paska postępu! – Alok

+0

Awesome Bro :) To działało dla mnie bardzo dziękuję za to :) –

1

Można użyć ProgressBar zamiast ProgressDialog. Utwórz ProgressBar wewnątrz niestandardowego okna dialogowego z TextView i innymi potrzebnymi widżetami.

1

Tak, API level 26 jest przestarzałe, lepiej można użyć tylko progressbar.

Użyj tego fragmentu kodu do tworzenia programowo:

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

Tak na przyszłość, zmień android.R.attr.progressBarStyleSmall do android.R.attr.progressBarStyleHorizontal.

Może ten guide może ci pomóc.

Mam nadzieję, że to może ci pomóc.

+0

więcej odnośników https://stackoverflow.com/questions/45373007/progressdialog-is-deprecated-what-is-the-alternate-one-to- posługiwać się –

1

Klasa ta została zaniechana poziomu API 26.

ProgressDialog jest modalnym, co uniemożliwia użytkownikowi współpracującą z aplikacją. Zamiast używać tej klasy, należy użyć wskaźnika postępu, takiego jak ProgressBar, który można osadzić w interfejsie aplikacji aplikacji. Możesz też użyć powiadomienia, aby poinformować użytkownika o postępie zadania.

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

1

Musisz utworzyć niestandardowy plik XML z układu ProgressBar na niego i pokazać, że zamiast. Używam biblioteki takiej jak https://github.com/Q115/DelayedProgressDialog, aby uzyskać to proste zachowanie.

Zastosowanie:

DelayedProgressDialog progressDialog = new DelayedProgressDialog(); 
progressDialog.show(getSupportFragmentManager(), "tag"); 
-2

ProgressDialog w przykładzie nigdy nie będzie widoczny, bo nazywasz dismiss() zaraz po show(). Utworzenie intencji i wywołanie startActivity() nie blokują: Zasadniczo wystarczy zaplanować przejście na inną czynność, która ma zostać wykonana "wkrótce".

Musisz się przenieść rozmowę dismiss() do aktywności za OnStop:

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

Ponadto można by zapytać: Dlaczego przejście od jednej czynności do drugiej trwa tak długo w tym przypadku? Przypuszczam, że Twoja MainActivity wykonuje ciężką pracę w swoich metodach onCreate/onStart/onResume. Lepszym sposobem obsługi może być umieszczenie całej tej pracy w osobnym wątku.

0

To właśnie udało mi się połączyć, ponieważ klasa została wycofana z Androida Oreo (API 26 +).

w pliku XML (cokolwiek plików layout):

<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> 

w powyższym przykładzie, myślałem o sytuacji przewijania że Twój widok jest długa stąd dwa paski postępu.

w próbce plików 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); 
       } 
      } 
     } 

} 

Cóż, to jest mój Hack więc mam nadzieję, że to pomaga.

0

Jeśli ktoś nalega na okno dialogowe postępu, w moim przypadku wybrałem pasek postępu w oknie dialogowym alertu. Aby rozpocząć, możesz użyć następującego kodu.

Mój przypadek był prosty, ponieważ potrzebowałem tylko nieokreślonego paska postępu. Aby uzyskać pełną wersję, musisz zamknąć ją w klasie i uzyskać dostęp do paska.

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; 
} 

Uwaga: Jeśli zastanawiasz się, dlaczego Bar znajduje się w pojemniku: ja po prostu nie mógł dostać wyściółka pracować na pasku konieczności wprowadzenia na pojemniku zamiast.