DialogFragment i Galleriapp med Android Support Library (rev.10).

Diskussion i 'Frågor, support och diskussion' startad av chrkad, 28 aug 2012.

  1. chrkad

    chrkad Kid Droid Medlem

    Blev medlem:
    8 sept 2009
    Inlägg:
    77
    Mottagna gillanden:
    28
    Operatör:
    Tre,Tele2
    Telefon:
    Google Pixel 7 Pro (Hazel)

    MINA ENHETER

    Operatör:
    Tre,Tele2
    Telefon:
    Google Pixel 7 Pro (Hazel)
    Telefon 2:
    iPhone 13 Pro Max
    Platta:
    Apple iPad Pro (12.9) + Pencil
    Övrigt:
    Fossil Sport,Google Home,Nest Hub,Chomecast Ultra/Audio
    Någon som har erfarenhet ifrån att använda DialogFragments tillsammans med "Android Support Library"? (även kallat Compability Package) för att få stöd för API < 11?

    Jag har försökt anpassa Wallpaper-koden från AOSP (Launcher2) att fungera med API < 11 med Android Support Library rev.10, men av någon anledning så fungerar det inte som tänkt när appen körs under Jelly Bean 4.1.1 (API 16) på en riktig device. Det funkar utmärkt i emulatorn.

    Jag har ändrat koden i ASL-biblioteket (android.support.v4.app.DialogFragment.java) per tipsen i http://stackoverflow.com/questions/5637894/dialogfragments-with-devices-api-level-11 annars så får man felet "DialogFragment can not be attached to a container view".

    Test OK:
    • Android 2.1 Emulator (API 7)
    • Android 2.2 Emulator (API 8)
    • Android 2.3.3 Emulator (API 10)
    • Android 4.0.3 Emulator (API 15)
    • Android 4.1 Emulator (API 16)
    • Android 2.3.7 Device (API 10)

    Fungerar ej:
    • Android 4.1.1 Device (API 16)

    Problemet som uppstår på 4.1.1 enheten är att den valda bilden från det horisontella bildspelet aldrig visas, förräns man roterar enheten. Väljer man en ny bild, och roterar, laddas bilden rätt. Dock laddas aldrig bilderna in om man håller enheten i samma läge.


    GalleryDemoDialogFragment.java:
    Kod:
    package gallery.android.demo;
    
    import android.support.v4.app.DialogFragment;
    import android.support.v4.app.FragmentActivity;
    
    import android.annotation.TargetApi;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.ColorFilter;
    import android.graphics.drawable.Drawable;
    import android.os.AsyncTask;
    import android.os.Build;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.Gallery;
    import android.widget.ImageView;
    import android.widget.ListAdapter;
    import android.widget.SpinnerAdapter;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    @SuppressWarnings("deprecation")
    @TargetApi(16)
    public class GalleryDemoDialogFragment extends DialogFragment implements AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener {
    
        private static final String TAG = "GalleryDemoDialogFragment";
        private static final String EMBEDDED_KEY = "gallery.android.demo.GalleryDemoDialogFragment.EMBEDDED_KEY";
    
        private boolean mEmbedded;
        private Bitmap mBitmap = null;
    
        private ArrayList<Integer> mThumbs;
        private ArrayList<Integer> mImages;
        private WallpaperLoader mLoader;
        private WallpaperDrawable mWallpaperDrawable = new WallpaperDrawable();
    
        public static GalleryDemoDialogFragment newInstance() {
        	GalleryDemoDialogFragment fragment = new GalleryDemoDialogFragment();
            fragment.setCancelable(true);
            return fragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState != null && savedInstanceState.containsKey(EMBEDDED_KEY)) {
                mEmbedded = savedInstanceState.getBoolean(EMBEDDED_KEY);
            } else {
                mEmbedded = isInLayout();
            }
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putBoolean(EMBEDDED_KEY, mEmbedded);
        }
    
        private void cancelLoader() {
            if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
                mLoader.cancel(true);
                mLoader = null;
            }
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            cancelLoader();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            cancelLoader();
        }
    
        @Override
        public void onDismiss(DialogInterface dialog) {
            super.onDismiss(dialog);
            FragmentActivity activity = getActivity();
            if (activity != null) {
                activity.finish();
            }
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            findWallpapers();
            return null;
        }
    
        @TargetApi(16)
    	@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            findWallpapers();
            if (mEmbedded) {
                View view = inflater.inflate(R.layout.wallpaper_chooser, container, false);
                switch (Build.VERSION.SDK_INT) {
            	case Build.VERSION_CODES.ICE_CREAM_SANDWICH :
            		view.setBackgroundDrawable(mWallpaperDrawable);
            		break;
            	case Build.VERSION_CODES.JELLY_BEAN :
            		view.setBackground(mWallpaperDrawable);
            		break;
            	default:
            		view.setBackgroundDrawable(mWallpaperDrawable);
            		break;
                }
    
                final Gallery gallery = (Gallery) view.findViewById(R.id.gallery);
                gallery.setCallbackDuringFling(false);
                gallery.setOnItemSelectedListener(this);
                gallery.setAdapter(new ImageAdapter(getActivity()));
               
                View setButton = view.findViewById(R.id.set);
                setButton.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                		int position = gallery.getSelectedItemPosition();
                		String[] wallpaperArray = getResources().getStringArray(R.array.wallpapers);
                		String name = wallpaperArray[position]+".jpg";
                		
                		Log.i(TAG, "Position="+position);
                		Log.i(TAG, "Filename="+name);
               		Toast.makeText(getActivity().getApplicationContext(), "(Save2SD)\n"+
    									  "Position="+position+"\n"+
    									  "Filename="+name+
    									  "", Toast.LENGTH_SHORT).show();
                    }
                });
                return view;
            }
            return null;
        }
    
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        }
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
                mLoader.cancel();
            }
            Log.d(TAG, "onItemSelected()");
            mLoader = (WallpaperLoader) new WallpaperLoader().execute(position);
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    
        private void findWallpapers() {
            mThumbs = new ArrayList<Integer>(24);
            mImages = new ArrayList<Integer>(24);
    
            final Resources resources = getResources();
            final String packageName = resources.getResourcePackageName(R.array.wallpapers);
    
            addWallpapers(resources, packageName, R.array.wallpapers);
            addWallpapers(resources, packageName, R.array.extra_wallpapers);
        }
    
        private void addWallpapers(Resources resources, String packageName, int list) {
            final String[] extras = resources.getStringArray(list);
            for (String extra : extras) {
                int res = resources.getIdentifier(extra, "drawable", packageName);
                if (res != 0) {
                    final int thumbRes = resources.getIdentifier(extra + "_small", "drawable", packageName);
                    if (thumbRes != 0) {
                        mThumbs.add(thumbRes);
                        mImages.add(res);
                    }
                }
            }
        }
        
        
        private class ImageAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter {
            private LayoutInflater mLayoutInflater;
    
            ImageAdapter(FragmentActivity activity) {
                mLayoutInflater = activity.getLayoutInflater();
            }
    
            public int getCount() {
                return mThumbs.size();
            }
    
            public Object getItem(int position) {
                return position;
            }
    
            public long getItemId(int position) {
                return position;
            }
    
            public View getView(int position, View convertView, ViewGroup parent) {
                View view;
    
                if (convertView == null) {
                    view = mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
                } else {
                    view = convertView;
                }
    
                ImageView iv = (ImageView) view.findViewById(R.id.wallpaper_image);
    
                int thumbRes = mThumbs.get(position);
                iv.setImageResource(thumbRes);
    
                Drawable thumbDrawable = iv.getDrawable();
                if (thumbDrawable != null) {
                    thumbDrawable.setDither(true);
                } else {
                    Log.e(TAG, "Error decoding thumbnail resId=" + thumbRes + " for wallpaper #" + position);
                }
                return view;
            }
        }
    
    
        private class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> {
            BitmapFactory.Options mOptions;
    
            WallpaperLoader() {
                mOptions = new BitmapFactory.Options();
                mOptions.inDither = false;
                mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
            }
    
            @Override
            protected Bitmap doInBackground(Integer... params) {
                if (isCancelled()) return null;
                try {
                    return BitmapFactory.decodeResource(getResources(), mImages.get(params[0]), mOptions);
                } catch (OutOfMemoryError e) {
                    return null;
                }
            }
    
            @Override
            protected void onPostExecute(Bitmap b) {
                if (b == null) return;
                if (!isCancelled() && !mOptions.mCancel) {
                    if (mBitmap != null) {
                        mBitmap.recycle();
                    }
    
                    View v = getView();
                    if (v != null) {
                    	Log.d(TAG, "WallpaperLoader.onPostExecute() getView != null");
                        mBitmap = b;
                        mWallpaperDrawable.setBitmap(b); // Doesn't appear to work on (physical) device with Jelly Bean (4.1.1)?
                        v.postInvalidate();
                    } else {
                    	Log.d(TAG, "WallpaperLoader.onPostExecute(Bitmap b) getView == null");
                        mBitmap = null;
                        mWallpaperDrawable.setBitmap(null);
                    }
                    mLoader = null;
                } else {
                   b.recycle();
                }
            }
    
            void cancel() {
                mOptions.requestCancelDecode();
                super.cancel(true);
            }
        }
    
        private static class WallpaperDrawable extends Drawable {
    
            Bitmap mBitmap;
            int mIntrinsicWidth;
            int mIntrinsicHeight;
    
            void setBitmap(Bitmap bitmap) {
            	Log.d(TAG, "WallpaperDrawable.setBitmap(Bitmap)");
                mBitmap = bitmap;
                if (mBitmap == null) {
                	Log.d(TAG, "WallpaperDrawable.setBitmap(Bitmap) mBitmap == null");
                    return;
                }
                mIntrinsicWidth = mBitmap.getWidth();
                mIntrinsicHeight = mBitmap.getHeight();
            }
    
            @Override
            public void draw(Canvas canvas) {
                if (mBitmap == null) {
                	Log.d(TAG, "WallpaperDrawable.draw(Canvas) mBitmap == null");
                	return;
                }
                Log.d(TAG, "WallpaperDrawable.draw(Canvas)");
                int width = canvas.getWidth();
                int height = canvas.getHeight();
                int x = (width - mIntrinsicWidth) / 2;
                int y = (height - mIntrinsicHeight) / 2;
                canvas.drawBitmap(mBitmap, x, y, null);
            }
    
            @Override
            public int getOpacity() {
                return android.graphics.PixelFormat.OPAQUE;
            }
    
            @Override
            public void setAlpha(int alpha) {
            }
    
            @Override
            public void setColorFilter(ColorFilter cf) {
            }
        }
    }
    
    
    Uppdatering:
    Det löstes med "invalidateSelf();" i void setBitmap(Bitmap bitmap).
     
    Last edited: 15 sept 2012