دیالوگ سفارشی (( کمکم کنید دوستان ))
من این کدو نوشتم و به متدی که برای دانلود بود توو پروژه ی استاد پاس دادم اما بازم بالا نیومد .. نمیدونم که مشکل از کجاست...
public static void DownloadProgressMuisc() { final Dialog dialog = new Dialog(G.currentActivity); dialog.setContentView(R.layout.pr); Button btnStop = (Button) dialog.findViewById(R.id.btnStop); final TextView txtPercent = (TextView) dialog.findViewById(R.id.txtPercent); TextView totalSize = (TextView) dialog.findViewById(R.id.totalSize); final ProgressBar prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload); OnProgressDownloadListener listener = new OnProgressDownloadListener() { private String convertByteToMB(int byteLength) { float sizeInKB = (float) byteLength / 1024; float sizeInMB = (float) sizeInKB / 1024; return String.format("%.1fMB", sizeInMB); } @Override public void onProgressDownload(int percent, int downloadedSize, int fileSize) { prgDownload.setProgress(percent); String totalSize = convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize); txtPercent.setText(percent + "% " + totalSize); if (percent >= 100) { txtPercent.setText("Download Complete"); } } };
مسعود جان مراحل به این صورته:
1: دانلودر رو مینویسی
2: توی دانلودر وقتی دانلود انجام میشه توسط UI Thread به دیالوگت دسترسی پیدا میکنی و ProgressBar رو آپدیت میکنی.
برای انجام این کار باید یک لیستنر برای دانلود بنویسی. بهتره آموزش های استاد(ساخت لیستنر، دیالوگ، دانلودر) رو دوباره ببینی. اگر اینارو دیدی و نتونستی درستش کنی کد هاتو قرار بده حتما کمکت میکنم. من 1-2 روزی درگیرم ولی بعدش هر کمکی از دستم بر بیاد انجام میدم.
راسش برنامه ی از نطر کد نویسی خیلی شبیه پروژهی مارکت استاد هست . برای این که بتونم ی dialog سفارشی داشته باشم تا بم میزان دانلود رو مطابق عکس بالا نشونم بده یک سری کد هایی اضافه کردم به پروژم که داستانش ازین قراره :
1) من اومدم توو پروژم ی کلاس به اسم OnProgressDownloadListener درست کردم که توش این محتوا موجد هست:
public class OnProgressDownloadListener { public void onProgressDownload(int percent, int finalDownloadedSize, int totalSize) { }
بعدش :
2) توو کلاس DownloadRequest اومدم این کارو کردم :
public class DownloadRequest { private int downloadedSize; private int totalSize; private int percent; public int getDownloadedSize() { return downloadedSize; } public int getTotalSize() { return totalSize; } public int getPercent() { return percent; } public DownloadRequest download() { Thread thread = new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(downloadPath); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.connect(); totalSize = connection.getContentLength(); File file = new File(filepath); if (file.exists()) { file.delete(); } FileOutputStream outputStream = new FileOutputStream(filepath); InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[G.DOWNLOAD_BUFFER_SIZE]; int len = 0; while ((len = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, len); downloadedSize += len; percent = (int) (100.0f * (float) downloadedSize / totalSize); if (percent == 100 && listener != null) { final int finalDownloadedSize = downloadedSize; G.HANDLER.post(new Runnable() { @Override public void run() { listener.onDownloadComplete(downloadPath, filepath); progressListener.onProgressDownload(percent, finalDownloadedSize, totalSize); <<=============>> اینو اضافه کردم
} }); } if (simulate) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); thread.start(); return this; } private String downloadPath; private String filepath; private OnDownloadCompleteListener listener; private OnProgressDownloadListener progressListener; <<=================================>> اینو اضافه کردم private boolean simulate; public DownloadRequest downloadPath(String value) { downloadPath = value; return this; } public DownloadRequest filepath(String value) { filepath = value; return this; } public DownloadRequest listener(OnDownloadCompleteListener value) { listener = value; return this; } public DownloadRequest progressListener(OnProgressDownloadListener value) { <<=================================>> اینو اضافه کردم
progressListener = value; return this; } public DownloadRequest simulate(boolean value) { simulate = value; return this; } }
بعدش :
3) برای تمیز تر شدن کار و شلوغ نشدن پروژه اومدم ی کلاس به اسم Dialogs درست کردم که هر دیالوگی که دارم رو این کلاس فرا خونی کنم . و برای همین منظور من ی دیالوگ سفارشی به اسم ((pr.xml )) ساختم که قیافش میشه اون عکس بالایی .(( ظاهرش بعدا عوض میشه خخخخ)) . که این دیالوگ کدش ازین قراره :
static void ProgressDownloader() { final Dialog dialog = new Dialog(G.currentActivity); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.pr); final ProgressBar prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload); Button btnStop = (Button) dialog.findViewById(R.id.btnStop); final TextView txtDownload = (TextView) dialog.findViewById(R.id.txtDownload); btnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { dialog.dismiss(); } }); OnProgressDownloadListener listener = new OnProgressDownloadListener() { private String convertByteToMB(int byteLength) { float sizeInKB = (float) byteLength / 1024; float sizeInMB = (float) sizeInKB / 1024; return String.format("%.1fMB", sizeInMB); } @Override public void onProgressDownload(int percent, int downloadedSize, int fileSize) { prgDownload.setProgress(percent); txtDownload.setText(percent + "% " + convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize)); if (percent >= 100) { txtDownload.setText("Download Complete"); } } }; dialog.show(); }
و مرحله ی آخر :
4) من بعد ازین که ای دیالوگ رو ساختم اومدم در متدی که استاد نوشت برای دانلود اپلیکیش ((apk )) اونجا اومدم این متد رو صدا زدم که وقتی فایل مورد نطر داره دانلود میشه بم این دیالوگ رو نشون بده اما این اتفاق نمیفته .. اینم متد دانلود و پاس دادن دیالوگ به اون ..
public static void DownloadMusic() { final String filename = HelperString.getFileName(G.selectedMusic.file); DownloadRequest downloadRequest = new DownloadRequest() .downloadPath("http://169.254.72.1/Folkolor/" + G.selectedMusic.file) .filepath(G.DIR_MUSIC + "/" + filename) .listener(new OnDownloadCompleteListener() { @Override public void onDownloadComplete(String url, String localPath) { File file = new File(localPath); new File(G.DIR_MUSIC + "/" + filename).exists(); Dialogs.ProgressDownloader(); <<============================>> اینو اضافه کردم } }) .download(); }
اگه میشه کمک کنید تا مشکلم حل بشه . مرسی
progressListener.onProgressDownload(percent, finalDownloadedSize, totalSize);
این باید بره بالای if ، چون شما میخوای با هر تغییر مقدار رو ارسال کنی نه وقتی 100% شد
اینا رو درست کنید اگر مشکل حل نشد دوباره بررسی میکنم. شرمنده من این چند روزه خیلی درگیرم ممکنه یکم دیر به دیر جواب بدم.
کد هاتون رو خیلی شلوغ کردید برای ساخت دایلوگ و پر کردن داده ها به این صورت عمل کنید :
1- یک کلاس بسازید که extends Dialog باشه و کد ها و کاسنترامتور هاش رو بنویسید و فراخونی کنید .
2- لایه ایجاد شده برای dialog که توش progressbar هست رو به دایلوگتون ست کنید .
3-همه ایتم های مورد نیاز از جمله progressbar رو توی کلاس dialog معرفی کنید .
4- یه متد مینویسید که مقدار درصد دانلود رو در پروگرس بار ست کنه.
5-توجه داشته باشید برای تغییر ui نیاز به هندلر دارید.
سلام جناب criss زیر کدتون به صورت کامنت مشکلتون رو گفتند.
شما در متد DownloadMusic فقط listener مربوط به پایان دانلود یعنی onDownloadComplete را ست کردید و listener مربوط به OnProgressDownloadListener را ست نکردید ،در ضمن شما در listener مربوط به پایان دانلود فایل دیالوگ را صدا زدید یعنی هنگامی که دیگه دانلود تموم شده.
در متد ProgressDownloader هم اومدید listener مربوط به OnProgressDownloadListener را تعریف کردید اما اون رو هیچ جا صدا نزدید.
امیدوارم پاسخم درست باشه...
محمد حسین جان من این کاری که شما گفتید رو انجام دادم ... اما کار نمیکنه ..
public class Dialoog extends Dialog { public Dialoog(Context context) { super(context); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.pr); } protected Dialoog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); LayoutInflater li = LayoutInflater.from(getContext()); View view = li.inflate(R.layout.pr, null); Dialog dialog = new Dialog(G.currentActivity); final TextView txtDownload = (TextView) view.findViewById(R.id.txtDownload); final TextView totalSizes = (TextView) view.findViewById(R.id.totalSizes); final ProgressBar prgDownload = (ProgressBar) view.findViewById(R.id.prgDownload); OnProgressDownloadListener listener = new OnProgressDownloadListener() { private String convertByteToMB(int byteLength) { float sizeInKB = (float) byteLength / 1024; float sizeInMB = (float) sizeInKB / 1024; return String.format("%.1fMB", sizeInMB); } @Override public void onProgressDownload(int percent, int downloadedSize, int fileSize) { prgDownload.setProgress(percent); String totalSize = convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize); txtDownload.setText(percent + "% " + totalSize); totalSizes.setText(fileSize); } }; dialog.show(); } public Dialoog(Context context, int theme) { super(context, theme); } }
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .