Friday, February 10, 2012

[Android] Tổng kết kinh nghiệm làm việc với các loại View

1. Bạn muốn tạo OptionsMenu có khả năng thay đổi?
SOLUTION: sử dụng onPrepareOptionsMenu(Menu menu) thay vì onCreateOptionsMenu


2. Khi nào thì cần extend một View?
SOLUTION: có lẽ bạn chỉ cần 1 loại View mới khi hình ảnh của bạn thường xuyên thay đổi hoặc thật là quái dị :)) khác biệt với các View mà android đã cung cấp. Với những thao tác với 1 View bạn muốn làm như: di chuyển, thay đổi kích cỡ, độ trong suốt thì bạn vẫn chưa cần phải extend 1 View. 


Cụ thể:
Hãy sử dụng các FLAG của WindowManager.LayoutParams để thu được hiệu quả mong muốn, ví dụ:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.TRANSLUCENT);
        // set position
        params.gravity = Gravity.LEFT | Gravity.TOP;
        params.x = (int) xOfIcon;
        params.y = (int) yOfIcon;

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

        mIcon = new ImageView(this);
        mIcon.setImageResource(R.drawable.icon);
        // Set alpha
        mIcon.setAlpha(mPreferences.getInt("alpha", 255));

        // set Size
        sizeRate = mPreferences.getInt("size", 25);
        halfOfIconSize = sizeRate / 2;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.icon);
        Bitmap scaled = Bitmap.createScaledBitmap(bitmap, sizeRate, sizeRate,
                true);
        mIcon.setImageBitmap(scaled);

        // invalidate (update view)
        mIcon.invalidate();
        // Add view
        wm.addView(mIcon, params);


3. Có thể kết hợp giữa View lập trình và View đã set trong file layout XML ?
SOLUTION:
thay vì dung <ImageView .../> ta sẽ thay bằng Qualified Name của class chưa View muốn đặt vào vị trí đó. VD: <com.hvn.activity.XXXView .../>


4. Khi viết code để DragNDrop 1 view. Nếu gặp lỗi hình ảnh nhảy loạn lên khi kéo?
SOLUTION: hãy dùng getRawX() thay vì getX()

5. Không có khác biệt giữa ImageButton và ImageView click được. Hai view này chỉ khác nhau ở style ban đầu:
Default ImageButton:
 <style name="Widget.ImageButton">
     <item name="android:focusable">true</item>
     <item name="android:clickable">true</item>
     <item name="android:scaleType">center</item>
     <item name="android:background">@android:drawable/btn_default</item>
 </style>
 
 Khi dùng 1 custom list, nếu cho ImageButton vào sẽ không click được list item do ImageButton đã set focusable = true. Giải pháp là set = false hoặc dùng ImageView thay thế.

No comments: