android進度條對話框
Ⅰ android 進度條樣式 怎麼改
Android系統提供了兩大類進度條樣式,長形進度條(progressBarStyleHorizontal) 和圓形進度條(progressBarStyleLarge)。
android 進度條樣式更改:
第一種
(默認樣式(中等圓形))
進度條用處很多,比如,應用程序裝載資源和網路連接時,可以提示用戶稍等,這一類進度條只是代表應用程序中某一部分的執行情況,而整個應用程序執行情況呢,則可以通過應用程序標題欄來顯示一個進度條,這就需要先對窗口的顯示風格進行設置"requestWindowFeature(Window.FEATURE_PROGRESS)"。
Ⅱ android網路載入進度條怎麼使用
由於Android的界面更新只能通過自己的UI線程進行操作,所以我們需要用到Handler在進行更新界面的操作。
1、聲明變數
private Handler handler = new Handler();
private ProgressDialog progressDialog = null;
2、在開始進行網路連接時顯示進度條對話框
progressDialog = ProgressDialog.show(MyActivity.this, "請稍等...", "獲取數據中...", true);
3、在handler.post中進行界面更新
public void setListAdapter(){
handler.post(new Runnable() {
public void run() {
//將獲取到的數據更新到列表中
MyListView.setAdapter(saImageItems);
}
}
});
4、開個新的線程進行網路連接獲取數據
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//向伺服器請求數據
mapList=MyAPI.getAllDatas();
setListAdapter(mapList);
//更新完列表數據,則關閉對話框
progressDialog.dismiss();
}}).start();
整個過程就這樣完成了,下面是效果圖:
Ⅲ android內部帶刻度的圓形進度條
78910111213
//circleCenter 整個圓半徑 radius圓環的半徑
RectF oval = new RectF(circleCenter - radius, circleCenter - radius, circleCenter + radius, circleCenter + radius);
//因為-90°才是從12點鍾方向開始 所以從-90開始 progress 為進度
canvas.drawArc(oval, -90, (float) (progress * 3.6), false, paint);
Ⅳ android 如何實現彈出一個進度條後,再彈出一個倒計時的界面。
實現流程
Step One 彈出進度條對話框
Step Two 執行線程,在線程中實現數據的非同步載入
Step Three 在線程數據載入完成後,調用Handler並集合數據,更新界面
java代碼
//添加非同步操作
m_Dialog=ProgressDialog.show(m_context, "請等待...", "正在下載安裝文件,請稍後...",true);
//mRegsiterHandler.sleep(100);
new Thread(new Runnable(){
@Override
public void run() {
//載入數據
result=0;
try{
//下載文件
String url="http://00.00.00.00:80/nationaltest.html";
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response;
response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
FileOutputStream fileOutputStream = null;
if (is != null) {
File file = new File(Environment.getExternalStorageDirectory(), "nationaltest.apk");
fileOutputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int ch = -1;
while ((ch = is.read(buf)) != -1) {
fileOutputStream.write(buf, 0, ch);
}
}
fileOutputStream.flush();
if (fileOutputStream != null) {
fileOutputStream.close();
}
result=2;
}
catch(Exception ex){
result=-1;
}
//更新界面
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
if(result==2)
install();
else
Toast.makeText(m_context, "下載文件失敗,請檢查網路連接", Toast.LENGTH_SHORT).show();
}
});
m_Dialog.dismiss();
}}).start();
}
Ⅳ Android水平進度條顏色和樣式
java.lang.Object
↳android.view.View
↳android.widget.ProgressBar
直接子類:AbsSeekBar extends ProgressBar;間接子類:RatingBar, SeekBar。
ProgressBar有兩種展示形式:
(1)android:progressBarStyle:默認進度條樣式,不確定模式;(分大小)
(2)android:progressBarStyleHorizontal:水平進度條樣式。
1、progress布局:
為改變進度條樣式和顏色,需要復寫Android系統自帶的樣式並引用:android:progressDrawable="@drawable/progressbar";
2、下面為drawable下progressbar.xml:
Ⅵ android 怎麼自定義繪制如下圖中這種進度條
下面是安卓學習手冊中實現各種進度條的截圖:
要想看各種進度條的實現代碼和文檔,直接去360手機助手中下載安卓學習手冊,例子文檔隨便看。
1、說明
在某些操作的進度中的可視指示器,為用戶呈現操作的進度,還它有一個次要的進度條,用來顯示中間進度,如在流媒體播放的緩沖區的進度。一個進度條也可不確定其進度。在不確定模式下,進度條顯示循環動畫。這種模式常用於應用程序使用任務的長度是未知的。
2、XML重要屬性
android:progressBarStyle:默認進度條樣式
android:progressBarStyleHorizontal:水平樣式
3 重要方法
getMax():返回這個進度條的范圍的上限
getProgress():返回進度
getSecondaryProgress():返回次要進度
incrementProgressBy(int diff):指定增加的進度
isIndeterminate():指示進度條是否在不確定模式下
setIndeterminate(boolean indeterminate):設置不確定模式下
setVisibility(int v):設置該進度條是否可視
4 重要事件
onSizeChanged(int w, int h, int oldw, int oldh):當進度值改變時引發此事件
5進度條的樣式
Widget.ProgressBar.Horizontal長形進度
Androidxml 布局:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal "
/>
源碼:
private ProgressBar mProgress;
private int mProgressStatus=0;
private Handler mHandler=newHandler();
@Override
protected void onCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgress=(ProgressBar)findViewById(R.id.progress_bar);
new Thread(new Runnable(){
@Override
public void run(){
while(mProgressStatus<100){
mProgressStatus=doWork();
mHandler.post(new Runnable(){
@Override
public void run(){
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
}
效果圖:
帶第二進度的進度條
xml配置如下:
<ProgressBar
android:id="@+id/progress_bar_with_second"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progress="40"
android:secondaryProgress="70"
android:paddingTop="20dp"
android:paddingBottom="20dp"/>
這里我們設置了初始的進度為40,android:progress的值在mini和max之間即mini<=progressvalue<=max
設置了第二進度條的進度值為70,該值也在mini和max之間。
效果如下:
不確定模式進度條
xml配置文件:
<ProgressBar
android:id="@+id/progress_bar_indeterminate"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:indeterminateBehavior="cycle"
android:paddingBottom="20dp"
android:paddingTop="20dp"
android:progress="40" />
這里通過android:indeterminate="true"設置了當前為無模式進度條
效果如圖:
普通圓形進度:Widget.ProgressBar.Inverse
<ProgressBar
android:id="@+id/progress_bar1"
style="@android:style/Widget.ProgressBar.Inverse"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progress="50"
android:background="#ff00ff"
android:paddingTop="4dp" />
通過android:backgroup設置了背景色
Ⅶ 如何對Android的版本進行檢測與更新
一、准備
1.檢測當前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.從伺服器獲取版本號(版本號存在於xml文件中)並與當前檢測到的版本進行匹配,如果不匹配,提示用戶進行升級,如果匹配則進入程序主界面。
3.當提示用戶進行版本升級時,如果用戶點擊了確定,系統將自動從伺服器上下載並進行自動升級,如果點擊取消將進入程序主界面。
二、效果圖
三、必要說明
伺服器端存儲apk文件,同時有version.xml文件便於比對更新。
<?xml version="1.0" encoding="utf-8"?>
<info>
<version>2.0</version>
<url>http://192.168.1.187:8080/mobilesafe.apk</url>
<description>檢測到最新版本,請及時更新!</description>
<url_server>http://192.168.1.99/version.xml</url_server>
</info>
通過一個實體類獲取上述信息。
package com.android;
public class UpdataInfo {
private String version;
private String url;
private String description;
private String url_server;
public String getUrl_server() {
return url_server;
}
public void setUrl_server(String url_server) {
this.url_server = url_server;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
apk和版本信息地址都放在伺服器端的version.xml里比較方便,當然如果伺服器端不變動,apk地址可以放在strings.xml里,不過版本號信息是新的,必須放在伺服器端,xml地址放在strings.xml。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, VersionActivity!</string>
<string name="app_name">Version</string>
<string name="url_server">http://192.168.1.99/version.xml</string>
</resources>
不知道讀者發現沒有,筆者犯了個錯誤,那就是url_server地址必須放在本地,否則怎麼讀取version.xml,所以url_server不必在實體類和version里添加,畢竟是現需要version地址也就是url_server,才能夠讀取version。
三、代碼實現
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_getVersion"
android:text="檢查更新"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
package com.android;
import java.io.InputStream;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
public class UpdataInfoParser {
public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "utf-8");
int type = parser.getEventType();
UpdataInfo info = new UpdataInfo();
while(type != XmlPullParser.END_DOCUMENT ){
switch (type) {
case XmlPullParser.START_TAG:
if("version".equals(parser.getName())){
info.setVersion(parser.nextText());
}else if ("url".equals(parser.getName())){
info.setUrl(parser.nextText());
}else if ("description".equals(parser.getName())){
info.setDescription(parser.nextText());
}
break;
}
type = parser.next();
}
return info;
}
}
package com.android;
import java.io.File;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class VersionActivity extends Activity {
private final String TAG = this.getClass().getName();
private final int UPDATA_NONEED = 0;
private final int UPDATA_CLIENT = 1;
private final int GET_UNDATAINFO_ERROR = 2;
private final int SDCARD_NOMOUNTED = 3;
private final int DOWN_ERROR = 4;
private Button getVersion;
private UpdataInfo info;
private String localVersion;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getVersion = (Button) findViewById(R.id.btn_getVersion);
getVersion.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
localVersion = getVersionName();
CheckVersionTask cv = new CheckVersionTask();
new Thread(cv).start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private String getVersionName() throws Exception {
//getPackageName()是你當前類的包名,0代表是獲取版本信息
PackageManager packageManager = getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
0);
return packInfo.versionName;
}
public class CheckVersionTask implements Runnable {
InputStream is;
public void run() {
try {
String path = getResources().getString(R.string.url_server);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 從伺服器獲得一個輸入流
is = conn.getInputStream();
}
info = UpdataInfoParser.getUpdataInfo(is);
if (info.getVersion().equals(localVersion)) {
Log.i(TAG, "版本號相同");
Message msg = new Message();
msg.what = UPDATA_NONEED;
handler.sendMessage(msg);
// LoginMain();
} else {
Log.i(TAG, "版本號不相同 ");
Message msg = new Message();
msg.what = UPDATA_CLIENT;
handler.sendMessage(msg);
}
} catch (Exception e) {
Message msg = new Message();
msg.what = GET_UNDATAINFO_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case UPDATA_NONEED:
Toast.makeText(getApplicationContext(), "不需要更新",
Toast.LENGTH_SHORT).show();
case UPDATA_CLIENT:
//對話框通知用戶升級程序
showUpdataDialog();
break;
case GET_UNDATAINFO_ERROR:
//伺服器超時
Toast.makeText(getApplicationContext(), "獲取伺服器更新信息失敗", 1).show();
break;
case DOWN_ERROR:
//下載apk失敗
Toast.makeText(getApplicationContext(), "下載新版本失敗", 1).show();
break;
}
}
};
/*
*
* 彈出對話框通知用戶更新程序
*
* 彈出對話框的步驟:
* 1.創建alertDialog的builder.
* 2.要給builder設置屬性, 對話框的內容,樣式,按鈕
* 3.通過builder 創建一個對話框
* 4.對話框show()出來
*/
protected void showUpdataDialog() {
AlertDialog.Builder builer = new Builder(this);
builer.setTitle("版本升級");
builer.setMessage(info.getDescription());
//當點確定按鈕時從伺服器上下載 新的apk 然後安裝 װ
builer.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, "下載apk,更新");
downLoadApk();
}
});
builer.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//do sth
}
});
AlertDialog dialog = builer.create();
dialog.show();
}
/*
* 從伺服器中下載APK
*/
protected void downLoadApk() {
final ProgressDialog pd; //進度條對話框
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下載更新");
pd.show();
new Thread(){
@Override
public void run() {
try {
File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
sleep(3000);
installApk(file);
pd.dismiss(); //結束掉進度條對話框
} catch (Exception e) {
Message msg = new Message();
msg.what = DOWN_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}
}}.start();
}
//安裝apk
protected void installApk(File file) {
Intent intent = new Intent();
//執行動作
intent.setAction(Intent.ACTION_VIEW);
//執行的數據類型
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
}
}
package com.android;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.ProgressDialog;
import android.os.Environment;
public class DownLoadManager {
public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
//如果相等的話表示當前的sdcard掛載在手機上並且是可用的
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
//獲取到文件的大小
pd.setMax(conn.getContentLength());
InputStream is = conn.getInputStream();
File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len ;
int total=0;
while((len =bis.read(buffer))!=-1){
fos.write(buffer, 0, len);
total+= len;
//獲取當前下載量
pd.setProgress(total);
}
fos.close();
bis.close();
is.close();
return file;
}
else{
return null;
}
}
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ⅷ 跪求一個 android 視頻緩存完整demo(帶進度條)
在做手機開發時,經常碰到一些比較耗時的操作,這個時候進度條就開始派上用場了。 這個demo展示了ProgressBar進度條和ProgressDialog進度框。 一、ProgressDialog進度框,效果如圖所示: 代碼如下: 復制代碼 代碼如下: //進度對話框按鈕監聽 class ProssButtonListener implements OnClickListener { @Override public void onClick(View v) { myDialog = ProgressDialog.show(ProgressbarDemo.this, "進度條標題", "進度條內容", true); new Thread() { public void run() { try { /* 在這里寫上要背景運行的程序片段 */ /* 為了明顯看見效果,以暫停3秒作為示範 */ sleep(3000); } catch (Exception e) { e.printStackTrace(); } finally { // 卸載所創建的myDialog對象。 myDialog.dismiss(); } } }.start(); /* 開始運行運行線程 */ } } 二、進度條對話框,這里用兩種情況來動態顯示進度條刻度 1、handle方法 效果圖如下: 代碼如下: 復制代碼 代碼如下: //進度條handle按鈕監聽 class ProssBarHandleButtonListener implements OnClickListener { @Override public void onClick(View v) { progressBarHandle.setVisibility(View.VISIBLE); myProssBarhandleText.setVisibility(View.VISIBLE); progressBarHandle.setMax(1000); new Thread() { public void run() { for(int i=0;i<=1000;){ try { /* 在這里寫上運行的進度條 */ Message msg = new Message(); msg.what = 1; msg.getData().putInt("size", i); handler.sendMessage(msg);//handle發送消息 /* 為了明顯看見效果,以暫停1秒作為示範 */ sleep(100); i+=10; } catch (Exception e) { handler.obtainMessage(-1).sendToTarget(); e.printStackTrace(); } } } }.start(); /* 開始運行運行線程 */ } } //handle接收消息 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: progressBarHandle.setProgress(msg.getData().getInt("size")); float num = (float)progressBarHandle.getProgress()/(float)progressBarHandle.getMax(); int result = (int)(num*100); System.out.println("progressBarHandle.getProgress()======="+progressBarHandle.getProgress()); myProssBarhandleText.setText(result+ "%"); if(progressBarHandle.getProgress()==progressBarHandle.getMax()){ Toast.makeText(ProgressbarDemo.this, "下載成功", 1).show(); progressBarHandle.setVisibility(View.GONE); myProssBarhandleText.setVisibility(View.GONE); } break; case -1: Toast.makeText(ProgressbarDemo.this,"下載失敗", 1).show(); break; } } }; 2、使用AsyncTask方法,效果圖與handle效果一樣 具體代碼如下: 復制代碼 代碼如下: //進度條synctask按鈕監聽 class ProssBarSyncButtonListener implements OnClickListener { @Override public void onClick(View v) { new AsyncLoader().execute((Void)null); } } //AsyncTask 任務執行 class AsyncLoader extends AsyncTask<Void, Integer, Integer> { @Override // 在doInBackground方法執行前執行 protected void onPreExecute(){ progressBarHandle.setVisibility(View.VISIBLE); myProssBarhandleText.setVisibility(View.VISIBLE); progressBarHandle.setMax(100000); } // 做具體的耗時操作 protected Integer doInBackground(Void... params) { //這里以1萬的進度條刻度來顯示 int totalSize = 100000; for (int i = 0; i < 100000; ) { publishProgress(i); //通過推送消息傳遞數據給onProgressUpdate方法執行 i+=10; } return totalSize; } // 在doInBackground方法執行過程中執行 protected void onProgressUpdate(Integer... progress) { progressBarHandle.setProgress(progress[0]); float num = (float)progressBarHandle.getProgress()/(float)progressBarHandle.getMax(); int result = (int)(num*100); myProssBarhandleText.setText(result+ "%"); } // 在doInBackground方法結束後執行 protected void onPostExecute(Integer result) { Toast.makeText(ProgressbarDemo.this, "下載成功,下載了"+result, 1).show(); myProssBarhandleText.setVisibility(View.GONE); progressBarHandle.setVisibility(View.GONE); } } 點擊下載DEMO示例
Ⅸ android 實現Service上傳並在通知欄顯示進度條
手上項目需要實現選擇多個視頻後在上傳騰訊雲,由於視頻較大大,所以選擇Service來進行上傳任務,配合Notification顯示進度。
打開server直接發送一個Notification並拿到RemoteViews ;
這里要兼容下8.0設置好渠道id;
下面開始上傳
最後效果如圖,layout可以自己定義
如果無法顯示通知那應該安裝時默認設置了關閉通知,需要進入通知管理打開