بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

دیالوگ سفارشی (( کمکم کنید دوستان ))

مدیریت گفتگو
ba2ever 11 سال پیش
آخرین تغییر: 9 سال پیش

دوستان سلام من چطوری می تونم توو پروژه ی مارکت وقتی روو دکمه ی نصب کلیک می کنم میزان دانلود رو مثل عکس زیر  نشون بده؟


نظرات

کاشی زاده 11 سال پیش
آموزش استاد در رابطه با ساخت پروگرس بار سفارشی را مطالعه کنید.
ba2ever 11 سال پیش
مرسی .. راسش من ی دیالوگ اختصاصی برا خودم درس کردم اما نمی دونم که توو این پروژه ی استاد چطوری این متد ها رو به هم پاس بدم تا وقتی روو دکمه ی دانلود کلیک میکنم اول این صفحه ی دیالوگ نشون داده ش . اگه میشه کمک کنید محمد حسین جان ..
کاشی زاده 11 سال پیش
برای dialog یه متد بنویسید که درصد دانلود رو بگیره و توش متد progressbar رو صدا کنه .

پاسخ‌ها 8

ba2ever 11 سال پیش

من این کدو نوشتم  و به متدی که برای دانلود بود توو پروژه ی استاد پاس دادم  اما بازم بالا نیومد .. نمیدونم که مشکل از کجاست... 

 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");
                }
            }

        };

نظرات

ba2ever 11 سال پیش
دوستان اگه میشه کمک کنید
Criss 11 سال پیش
listener که ساختید رو کجا صدا زدید ؟ کجا استفاده کردید ؟ این listener زمانی کار میکنه < که دانلودی د حال اجرا باشه
Hajhosseini 11 سال پیش

مسعود جان مراحل به این صورته:
1: دانلودر رو مینویسی
2: توی دانلودر وقتی دانلود انجام میشه توسط UI Thread به دیالوگت دسترسی پیدا میکنی و ProgressBar رو آپدیت میکنی.
برای انجام این کار باید یک لیستنر برای دانلود بنویسی. بهتره آموزش های استاد(ساخت لیستنر، دیالوگ، دانلودر) رو دوباره ببینی. اگر اینارو دیدی و نتونستی درستش کنی کد هاتو قرار بده حتما کمکت میکنم. من 1-2 روزی درگیرم ولی بعدش هر کمکی از دستم بر بیاد انجام میدم.

نظرات

ba2ever 11 سال پیش
خیلی آقایی بخدا . حالا من تمام سعیمو میکنم که خودم درستش کنم اگه نشد مزاحمت میشم ♥ مرسی
ba2ever 11 سال پیش

راسش برنامه ی از نطر کد نویسی خیلی شبیه پروژهی مارکت استاد هست . برای این که بتونم ی 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();

    }

اگه میشه کمک کنید تا مشکلم حل بشه . مرسی

نظرات

Criss 11 سال پیش
شما لیستنری که ساختید رو باید همراه با لینک به این متد پاس بدید > download
Hajhosseini 11 سال پیش

 progressListener.onProgressDownload(percent, finalDownloadedSize, totalSize);

این باید بره بالای if ، چون شما میخوای با هر تغییر مقدار رو ارسال کنی نه وقتی 100% شد

 

اینا رو درست کنید اگر مشکل حل نشد دوباره بررسی میکنم. شرمنده من این چند روزه خیلی درگیرم ممکنه یکم دیر به دیر جواب بدم. 

نظرات

ba2ever 11 سال پیش
امتحان کردم اما اررور داد ... :| والا نمیدونم چیکار کنم :(
ba2ever 11 سال پیش
لطفا کمکم کنید...
کاشی زاده 11 سال پیش

کد هاتون رو خیلی شلوغ کردید برای ساخت دایلوگ و پر کردن داده ها به این صورت عمل کنید :

1- یک کلاس بسازید که extends Dialog باشه و کد ها و کاسنترامتور هاش رو بنویسید و  فراخونی کنید .

2- لایه ایجاد شده برای dialog که توش progressbar هست رو به دایلوگتون ست کنید .

3-همه ایتم های مورد نیاز از جمله progressbar رو توی کلاس dialog معرفی کنید .

4- یه متد مینویسید که مقدار درصد دانلود رو در پروگرس بار ست کنه.

5-توجه داشته باشید برای تغییر ui  نیاز به هندلر دارید.

نظرات

ba2ever 11 سال پیش
دوستان من هر کاری کردم نشد که نشد .. اگه میشه کمک کنید خواهشا کمکم کنید . بی سوادی بد دردیه .. اه
Morteza 11 سال پیش

سلام جناب criss زیر کدتون به صورت کامنت مشکلتون رو گفتند.

شما در متد DownloadMusic فقط listener مربوط به پایان دانلود یعنی onDownloadComplete را ست کردید و listener مربوط به OnProgressDownloadListener را ست نکردید ،در ضمن شما در listener مربوط به پایان دانلود فایل دیالوگ را صدا زدید یعنی هنگامی که دیگه دانلود تموم شده.

در متد ProgressDownloader هم اومدید listener مربوط به OnProgressDownloadListener را تعریف کردید اما اون رو هیچ جا صدا نزدید.

امیدوارم پاسخم درست باشه...

نظرات

ba2ever 11 سال پیش

محمد حسین جان من این کاری که شما گفتید رو انجام دادم ... اما کار نمیکنه .. 

 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);

    }

}

 

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .