ProgressDialog étant obsolète depuis le Android version O, je trouve toujours un meilleur moyen de faire ma tâche. La tâche consiste à passer de mon activité à un fragment. Tout fonctionne correctement mais le progrèsdialog n'est pas visible.J'ai essayé de l'implémenter mais ... le progrèsdialog ne fonctionne pas.
Il semble que la barre de progression fonctionnerait mais ne fonctionnerait toujours pas. J'ai besoin d'un ProgressDialog car il est simplement facile pour moi de définir mon titre et le message. J'ai besoin d'un spinner progressDialog mais je ne sais pas comment le faire. Voici un de mes travaux mais pas de mise en œuvre:
classe 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();
}
});
}
Je suis nouveau sur Android Version O. Toute aide me donnerait une nouvelle chose à apprendre!
Comme il est mentionné dans Android O documentation:
Cette classe était obsolète dans l'API de niveau 26. ProgressDialog est une boîte de dialogue modale qui empêche l'utilisateur d'interagir avec l'application. Au lieu d'utiliser cette classe, vous devez utiliser un indicateur de progression, tel que ProgressBar, qui peut être intégré à l'interface utilisateur de votre application. Vous pouvez également utiliser une notification pour informer l'utilisateur de l'avancement de la tâche.
Vous pouvez créer une vue personnalisée avec TextView et ProgressBar et gérer sa visibilité. Vous pouvez utiliser cette bibliothèque également parce qu'il utilise AlertDialog au lieu de ProgressDialog.
ProgressBar est très simple et facile à utiliser, la première étape est que vous pouvez faire une présentation XML de la boîte de dialogue que vous souhaitez afficher, disons que nous appelons cette présentation
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>
la prochaine étape est de créer AlertDialog qui montrera cette mise en page avec 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();
maintenant tout ce qui reste à faire est d'afficher et de masquer cette boîte de dialogue dans nos événements de clic comme celui-ci
progress_dialog.show(); // to show this dialog
progress_dialog.dismiss(); // to hide this dialog
et ça y est, cela devrait fonctionner, comme vous pouvez le constater, il est extrêmement simple et facile de mettre en oeuvre ProgressBar (comme ProgressDialog) au lieu de ProgressDialog, obsolète. maintenant, vous pouvez afficher/fermer cette boîte de dialogue dans Handler ou ASyncTask, cela vous convient, espérons que vous pourrez l'utiliser pour résoudre vos problèmes, applaudissements
Oui, API level 26
c'est obsolète, mieux vaut utiliser progressbar
seulement.
Utilisez cet extrait de code pour créer par programme:
ProgressBar progressBar = new ProgressBar(activity, null, Android.R.attr.progressBarStyleSmall);
Juste pour référence future, changez le Android.R.attr.progressBarStyleSmall
à Android.R.attr.progressBarStyleHorizontal
.
Peut-être que ceci guide pourrait vous aider.
J'espère que cela peut vous aider.
Vous pouvez utiliser ProgressBar
au lieu de ProgressDialog
. Créez un ProgressBar
dans une boîte de dialogue personnalisée avec TextView
et les autres widgets dont vous avez besoin.
Vous devez créer un fichier de présentation XML personnalisé avec ProgressBar et le montrer à la place. J'utilise une bibliothèque comme https://github.com/Q115/DelayedProgressDialog pour obtenir ce comportement simple.
Usage:
DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
Cette classe était obsolète dans l'API de niveau 26.
ProgressDialog est une boîte de dialogue modale, qui empêche l'utilisateur d'interagir avec l'application. Au lieu d'utiliser cette classe, vous devez utiliser un indicateur de progression, tel que ProgressBar, qui peut être intégré à l'interface utilisateur de votre application. Vous pouvez également utiliser une notification pour informer l'utilisateur de l'avancement de la tâche.
https://developer.Android.com/reference/Android/app/ProgressDialog.html
Si quelqu'un insiste pour avoir un dialogue de progression, dans mon cas, j'ai opté pour une barre de progression dans un dialogue d'alerte. Vous pouvez utiliser le code suivant pour commencer.
Mon cas était simple car j'avais juste besoin d'une barre de progression indéterminée. Pour une version à part entière, vous devrez l'encapsuler dans une classe et accéder à la barre.
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;
}
Remarque: si vous vous demandez pourquoi la barre se trouve dans un conteneur: je ne pouvais tout simplement pas obtenir que le rembourrage fonctionne sur la barre car elle devait être insérée dans le conteneur.
C’est ce que j’ai réussi à rassembler puisque la classe est déconseillée dans Android Oreo (API 26+).
Dans le fichier XML (quel que soit le fichier de mise en page):
<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>
dans l'exemple ci-dessus, j'ai pensé à une situation de défilement, ce qui signifie que votre vue est longue, d'où les deux barres de progression.
dans l'exemple de fichier 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 );
}
}
}
}
Eh bien, c'est mon bidouillage alors j'espère que ça aide.