2014-04-24 8 views
5

Ich möchte einen Fortschrittsdialog innerhalb eines Dialogfragments anzeigen.Fortschrittsdialog in DialogFragment anzeigen

Jedoch, wenn ich diesen Code verwenden

ProgressDialog prog = new ProgressDialog(ctx); 
prog.setTitle(getString(R.string.pleaseWait)); 
prog.setMessage(getString(R.string.webpage_being_loaded));  
prog.setCancelable(false); 
prog.setIndeterminate(true); 
prog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
prog.show(); 

der Fortschrittsdialog wird in dem Fragmente gezeigt, das das dialogFragment genannt, nicht in dem DialogFragment selbst.

Was habe ich falsch gemacht?

Antwort

1

Verwenden Sie ProgressBar in Ihrem Dialogfragment. fügen Sie die Fortschrittsanzeige in Ihrem XML-Code hinzu.

im Code:

ProgressBar progressBar = view.findViewById(R.id.progress); 
progressBar .show(); 

wenn Oberfläche:

progressBar.hide(); 
2

Try this:

ProgressDialog prog = (ProgressDialog)your_view.findViewById(R.id.yourprogress_id); 
prog.setTitle(getString(R.string.pleaseWait)); 
prog.setMessage(getString(R.string.webpage_being_loaded));  
prog.setCancelable(false); 
prog.setIndeterminate(true); 
prog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
prog.show(); 

Oder

Bei dynamischer Verwendung von ProgressDialog;

ProgressDialog prog= new ProgressDialog(getActivity());//Assuming that you are using fragments. 
prog.setTitle(getString(R.string.pleaseWait)); 
prog.setMessage(getString(R.string.webpage_being_loaded));  
prog.setCancelable(false); 
prog.setIndeterminate(true); 
prog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
prog.show(); 

auf Daten geladen,

prog.dismiss(); 

Jetzt, wenn der Fortschrittsbalken nicht in Ihrem Dialog zeigt, werden Sie einen benutzerdefinierten Dialog einstellen müssen und definieren Sie Ihre Fortschrittsbalken im Inneren dieser benutzerdefinierten Dialog.

20

Hier gehen Sie.

import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 


public class ProgressDialogFragment extends DialogFragment 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setCancelable(false); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme()); 
     dialog.setTitle(getString(R.string.pleaseWait)); 
     dialog.setMessage(getString(R.string.webpage_being_loaded)); 
     dialog.setIndeterminate(true); 
     dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     return dialog; 
    } 
} 
+0

Wie dies funktionieren soll, wenn Sie super.onCreateDialog nennen() zurückgeben? Sie geben Ihren erstellten Fortschrittsdialog nicht zurück. – Yar

+0

Danke Yar, reparierte den Tippfehler. – Simon

+0

Wie würden Sie auf den Dialog zugreifen, um den Fortschritt von 'AsyncTask.onProgressUpdate' zu ​​melden, wenn Ihnen ein konkreter 'ProgressDialogFragment frag' gegeben wurde? – TWiStErRob

4

Hier ist ein einfaches Dialogfragment Laden, die eine GIF als ziehbar Animation spielt

public class LoadingDialogFragment extends DialogFragment { 
    public static final String FRAGMENT_TAG = "LoadingFragment"; 
    private ImageView ivLoading; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.dialog_loading, container, false); 

     if (rootView != null) { 
      ivLoading = (ImageView) rootView.findViewById(R.id.iv_loading); 
      ivLoading.setBackgroundResource(R.drawable.anim_drawable); 
     } 
     return rootView; 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     return dialog; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Dialog dialog = getDialog(); 
     if (dialog != null) { 
      dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

      AnimationDrawable loadingAnimation = (AnimationDrawable) ivLoading.getBackground(); 
      loadingAnimation.start(); 
     } 
    } 
} 

Und Sie können es ein- und ausblenden mit:

public void showLoadingDialog() { 
     LoadingDialogFragment fragment = (LoadingDialogFragment) getSupportFragmentManager().findFragmentByTag(LoadingDialogFragment.FRAGMENT_TAG); 
     if (fragment == null) { 
     fragment = new LoadingDialogFragment(); 
     fragment.setCancelable(false); 
     getSupportFragmentManager().beginTransaction() 
            .add(fragment, LoadingDialogFragment.FRAGMENT_TAG) 
            .commitAllowingStateLoss(); 

     // fragment.show(getSupportFragmentManager().beginTransaction(), LoadingDialogFragment.FRAGMENT_TAG); 
     } 
    } 

    public void hideLoadingDialog() { 
     LoadingDialogFragment fragment = (LoadingDialogFragment) getSupportFragmentManager().findFragmentByTag(LoadingDialogFragment.FRAGMENT_TAG); 
     if (fragment != null) { 
     // fragment.dismissAllowingStateLoss(); 
     getSupportFragmentManager().beginTransaction().remove(fragment).commitAllowingStateLoss(); 
     } 
    } 

bearbeiten: Übrigens ist es Es ist keine gute Vorgehensweise, ein Dialogfeldfragment für asynchrone Vorgänge wie das Netzwerk anzuzeigen.

+0

Das Problem tritt auf, wenn Sie versuchen, den Dialog bei der Aktivitätswiederherstellung zu schließen. Das alte DialogFragment ist bereits zerstört, das neue ist noch nicht erstellt. Wie kann man ein Dialogfragment zuverlässig verwerfen? – vyndor

+0

@savepopulation, warum ist es nicht empfehlenswert, ein Dialogfeldfragment für asynchrone Vorgänge wie das Netzwerk anzuzeigen? – user1510006

+0

Wenn Sie ui mit einem Dialogfragment blockieren, kann der Benutzer nicht zum anderen Bildschirm wechseln oder zurückgehen oder STG else ausführen und wartet, bis der Netzwerkvorgang beendet wird. – savepopulation

1

Ich weiß, es ist eine sehr alte Post, aber ich möchte eine Lösung sagen. Wenn ich nicht falsch liege, versuchen Sie, Ihre progress dialog vor onStart lifecycle method zu zeigen. Zeigen progress dialog in onResume method.

0

zeigen die progressDialog in onStart Methode innerhalb DialogFragment Klasse

@Override 
public void onStart() { 
    super.onStart(); 
    ProgressDialog prog = new ProgressDialog(ctx); 
    prog.setTitle(getString(R.string.pleaseWait)); 
    prog.setMessage(getString(R.string.webpage_being_loaded));  
    prog.setCancelable(false); 
    prog.setIndeterminate(true); 
    prog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    prog.show(); 
}