Android UI 之 Progress&ProgressDialog

    xiaoxiao2022-08-11  19

    应用运行时,总有执行耗时的任务的时候,如果这个时候应用不作任何提示就这么干放着,很容易令用户误以为“死机”、“卡了”之类的,然后就做出强制退出,或重启的操作。为了避免用户误会及在此之后作出一些不必要的操作,我们可以使用Progress(进度条)来提示用户等待,应用是正常运行,只是在执行着耗时的任务。

    一、Progress 实例 xml布局文件:

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.yougel.progressdemo.ProgressActivity"> <ProgressBar android:id="@+id/in_small" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmall"/> <ProgressBar android:id="@+id/in_normal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/in_large" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleLarge"/> <ProgressBar android:id="@+id/in_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:progress="10" style="?android:attr/progressBarStyleHorizontal"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加进度" android:id="@+id/increate"/> <Button android:id="@+id/discreate" android:text="减少进度" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/in_f" android:text="变为确定"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/in_t" android:text="变为不确定"/> </LinearLayout>

    进度条一般有两种,一种是旋转的进度条,一种是水平的,通过style属性来确定 而水平的又有不确定与确定的区分,通过android:indeterminate属性来确定true表示不确定。 Activity代码:

    package com.example.yougel.progressdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; public class ProgressActivity extends AppCompatActivity { ProgressBar progressBar,aprogressBar; Button btn_ic,btn_dc,btn_in_f,btn_in_t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress); init(); } //初始化控件 public void init(){ progressBar= (ProgressBar) findViewById(R.id.in_horizontal); aprogressBar= (ProgressBar) findViewById(R.id.in_normal); btn_ic= (Button) findViewById(R.id.increate); btn_dc= (Button) findViewById(R.id.discreate); btn_in_f= (Button) findViewById(R.id.in_f); btn_in_t= (Button) findViewById(R.id.in_t); btn_ic.setOnClickListener(new MyClick()); btn_dc.setOnClickListener(new MyClick()); btn_in_f.setOnClickListener(new MyClick()); btn_in_t.setOnClickListener(new MyClick()); } //自定义点击事件接口 class MyClick implements View.OnClickListener{ @Override public void onClick(View v) { int ID=v.getId(); switch (ID){ case R.id.increate: int current=progressBar.getProgress(); progressBar.setProgress(current+10); break; case R.id.discreate: current=progressBar.getProgress(); progressBar.setProgress(current-10); break; case R.id.in_f: progressBar.setIndeterminate(false); break; case R.id.in_t: progressBar.setIndeterminate(true); break; } } } final int LOAD_ID=100; @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem loading=menu.add(0,LOAD_ID,0,"loading"); loading.setActionView(aprogressBar); loading.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); return super.onCreateOptionsMenu(menu); } }

    在这里通过getProgress的方法获取当前的进度,当然这是要在确定的进度条才能有效果,然后用setProgress方法设置进度,通过setIndeterminate来设置进度条是确定的还是不确定的

    二、ProgressDialog xml布局文件:

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.yougel.progressdemo.PrgressBarActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/in_t" android:text="旋转类"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/in_f" android:text="水平类" /> </LinearLayout>

    布局文件添加两个按钮点击生成进度条对话框

    Activity代码:

    package com.example.yougel.progressdemo; import android.app.ProgressDialog; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class PrgressBarActivity extends AppCompatActivity { Button btn_in_f,btn_in_t; ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_prgress_bar); init(); } public void init() { btn_in_f = (Button) findViewById(R.id.in_f); btn_in_t = (Button) findViewById(R.id.in_t); btn_in_t.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog=new ProgressDialog(getContext()); dialog.setTitle("温馨提示"); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setCancelable(false); dialog.setMessage("正在下载"); dialog.show(); new Thread(new Runnable() { @Override public void run() { for(int i=5;i>=0;i--){ if(i==0){ dialog.dismiss(); } final int current=i; runOnUiThread(new Runnable() { @Override public void run() { dialog.setMessage("窗口会在"+current+"秒后关闭"); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }); btn_in_f.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog=new ProgressDialog(getContext()); dialog.setTitle("正在下载"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setCancelable(false); dialog.show(); new Thread(new Runnable() { @Override public void run() { for(int i=0;i<=11;i++){ if(dialog.getProgress()==100){ dialog.dismiss(); } final int current=i; runOnUiThread(new Runnable() { @Override public void run() { dialog.setProgress(current*10); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }); } // protected Context getContext(){ return this; } }

    这里的ProgressDialog几个常用的方法 setTitle设置对话框标题 setMessage设置对话框显示的信息 setProgressStyle(ProgressDialog.STYLE_SPINNER)设置为旋转类型的进度条 setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)设置为水平类型的进度条 setCancelable 设置点击对话框外部是否可取消,true表示可以,false表示不可 show显示对话框 在上面的代码中通过新增一个子线程,并在子线程中执行循环操作来修改ProgressDialog的信息,如果不新建子线程直接在主线程操作的话,点击按钮是不会有任何响应的。但子线程又无法对UI进行修改,所以使用了runOnUiThread的方法,把对UI修改的操作放在里面。

    转载请注明原文地址: https://ju.6miu.com/read-1132654.html
    最新回复(0)