看板 AndroidDev 關於我們 聯絡資訊
public class MorePhotoDialog extends DialogFragment { private static final String TAG = "MorePhotoDialog"; private CustomAdapter _customAdapter; private Context _context; private ListView _listView; private LinearLayout _linearLayout; private ProgressBar _progressBar; public MorePhotoDialog(Context context) { Log.d(TAG, "new MorePhotoDialog"); _customAdapter = new CustomAdapter(context); _context = context; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.custom_adapter, null); _progressBar = (ProgressBar) view .findViewById(R.id.custom_adapter_progressBar2); _linearLayout = (LinearLayout) view .findViewById(R.id.custom_adapter_progressLine); _listView = (ListView) view.findViewById(R.id.custom_adapter_listView); _listView.setAdapter(_customAdapter); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(view); builder.setTitle(R.string.more_photo_dialog_more); return builder.create(); } int endFlag = 0; public void addImageLoaderTask(String... urls) { endFlag = urls.length - 1; for (int i = 0; i < urls.length - 1; i++) { ImageLoaderTask imageLoaderTask = new ImageLoaderTask(i); Log.d(TAG, "imageLoaderTask.execute: " + urls[i]); imageLoaderTask.execute(urls[i]); } } // private class ImageLoaderTask extends AsyncTask<String, Void, Bitmap[]> { private class ImageLoaderTask extends AsyncTask<String, Void, Void> { private int _flag = 0; private ProgressBar progressBar; public ImageLoaderTask(int flag) { _flag = flag; // progressBar = (ProgressBar) getActivity().findViewById(R.id.custom_adapter_progressBar2); } @Override protected void onPreExecute() { // TODO progress bar // Display progress bar if (_flag == 0) { _linearLayout.setVisibility(View.VISIBLE); // progressBar.setVisibility(View.VISIBLE); } } @Override protected Void doInBackground(String... url) { String imgUrl = url[0]; Log.w(TAG, "url[0] = " + url[0]); // Getting Caching directory File cacheDirectory = _context.getCacheDir(); // Temporary file to store the downloaded image File tmpFile = new File(cacheDirectory.getPath(), FunctionUtility.getLastString(imgUrl)); Log.d(TAG, "imgUrl(" + tmpFile.getName() + ") = " + imgUrl); if (!tmpFile.exists()) { Log.w(TAG, tmpFile.getPath() + " not exists"); BitmapFuntions.downloadBitmapFromUrl(imgUrl, tmpFile); } // Load bitmap and put in adapter Bitmap bitmap = BitmapFuntions.decodeFile(tmpFile, 300, 200); _customAdapter.addBitmap(bitmap); // Show Logs Log.d(TAG, "bitmap.getByteCount() = " + bitmap.getByteCount()); Log.d(TAG, tmpFile.getPath()); Log.d(TAG, tmpFile.getName() + " = " + tmpFile.length() / 1024 + " Kb"); return null; } @Override // protected void onPostExecute(Bitmap[] result) { protected void onPostExecute(Void result) { Log.d(TAG, "onPostExecute"); _customAdapter.notifyDataSetChanged(); if (_flag == endFlag) { _linearLayout.setVisibility(View.GONE); //progressBar.setVisibility(View.GONE); } } } } 呼叫dialogFragment的方法是 // Show MorePhotoDialog MorePhotoDialog morePhotoDialog = new MorePhotoDialog( Image_enlarge.this); morePhotoDialog .show(getSupportFragmentManager(), "morePhotoDialog"); morePhotoDialog.addImageLoaderTask(imglist); 可是會跑出NullPointerException 07-24 14:59:22.000: E/AndroidRuntime(7064): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference 07-24 14:59:22.000: E/AndroidRuntime(7064): at com.gundam.cool.dialog.MorePhotoDialog$ImageLoaderTask.onPreExecute(MorePhotoDialog.java:96) 07-24 14:59:22.000: E/AndroidRuntime(7064): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 07-24 14:59:22.000: E/AndroidRuntime(7064): at android.os.AsyncTask.execute(AsyncTask.java:535) 不懂為什麼抓不到view... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.155.148 ※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1406228461.A.A3C.html
markzog21:你把要顯示的view丟到asyncTask裡面去試試看 07/25 16:53
markzog21:要顯示dialog的view 07/25 16:53
試過了,也是一樣的結果
corrupt003:你的activity的layout裡有view叫 07/25 20:07
corrupt003:R.id.custom_adapter_progressBar2 嗎? 07/25 20:07
有,我是用alt+/找到的 ※ 編輯: comteken (140.124.249.8), 07/26/2014 09:25:59
corrupt003:alt + / 是找到R.java的所有資料…你還是要看activity 07/26 09:30
corrupt003: 的layout 有沒有訂義這個id,因為你是用getActivity去 07/26 09:30
corrupt003:取得view的 07/26 09:30
freesamael:morePhotoDialog.show() 是 non-blocking call, 07/29 19:48
freesamael:FragmentManager 會排程到下一次 main thread 空閒時 07/29 19:48
freesamael:才把 DialogFragment 加到 activity。因此 07/29 19:49
freesamael:onCreateDialog() 被呼叫的時間會在 07/29 19:49
freesamael:addImageLoaderTask() 之後,此時 layout 還沒設定 07/29 19:50