自定義控件之Dialog

 

簡單模仿android3.0的Dialog。
先上圖。當然,我寫的都是比較簡單的,但是按照這種方法,各種佈局都是可以實現的。

 




 

DialogView:

public class DialogView extends LinearLayout{
 
	public static final int WIDTH = 32;
 
	private Context mContext;
 
	private LinearLayout contentView;
	private ImageView icon;
	private TextView title;
 
	private TextView ok;
	private TextView cancel;
	private ImageView img;
 
	private LayoutInflater inflater;
 
	public DialogView(Context c) {
		this(c, null);
	}
 
	public DialogView(Context c, AttributeSet a) {
		super(c, a);
 
		this.setBackgroundResource(R.drawable.dialog_full_holo_dark);
		this.setPadding(60, 50, 60, 55);
		this.setGravity(Gravity.CENTER_HORIZONTAL);
		this.setOrientation(LinearLayout.VERTICAL);
 
		mContext = c;
		inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
		//標題佈局
		LinearLayout tLayout = new LinearLayout(c);
		tLayout.setOrientation(LinearLayout.HORIZONTAL);
		tLayout.setGravity(Gravity.CENTER_VERTICAL);
 
		//標題圖片
		icon = new ImageView(c);
		tLayout.addView(icon);
 
		//標題文字
		title = new TextView(c);
		title.setPadding(10, 10, 10, 10);
		title.setTextColor(Color.WHITE);
		tLayout.addView(title);
 
		this.addView(tLayout);
 
		//標題線
		ImageView hr = new ImageView(c);
		hr.setBackgroundColor(Color.parseColor("#6698fd"));
		hr.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 4));
		this.addView(hr);
 
		//內容
		contentView = new LinearLayout(c);
		this.addView(contentView);
 
		//底部按鈕佈局
		LinearLayout bLayout = (LinearLayout)inflater.inflate(R.layout.dialog_button, null);
 
		ok = (TextView) bLayout.findViewById(R.id.dlg_ok);
		ok.setVisibility(View.GONE);
		cancel = (TextView) bLayout.findViewById(R.id.dlg_cancel);
		cancel.setVisibility(View.GONE);
		img = (ImageView) bLayout.findViewById(R.id.dlg_img);
		img.setVisibility(View.GONE);
 
		this.addView(bLayout);
	}
 
	public void setMessage(int res) {
		setMessage().setText(res);
	}
 
	public void setMessage(String text) {
		setMessage().setText(text);
	}
 
	public void setMessage(CharSequence ch) {
		setMessage().setText(ch);
	}
 
	/**
	 * 單條消息
	 */
	private TextView setMessage() {
		LinearLayout layout = new LinearLayout(mContext);
		layout.setOrientation(LinearLayout.HORIZONTAL);
		layout.setGravity(Gravity.CENTER_VERTICAL);
		TextView tv = new TextView(mContext);
		tv.setPadding(5, 10, 10, 10);
		layout.addView(tv);
		addContentView(layout);
		return tv;
	}
 
	/**
	 * 確定按鈕的監聽事件
	 * @param listener
	 */
	public void setOkListener(OnClickListener listener) {
		ok.setVisibility(View.VISIBLE);
		ok.setOnClickListener(listener);
		updateImage();
	}
 
	/**
	 * 取消按鈕的監聽事件
	 * @param listener
	 */
	public void setCancelListener(OnClickListener listener) {
		cancel.setVisibility(View.VISIBLE);
		cancel.setOnClickListener(listener);
		updateImage();
	}
 
	private void updateImage() {
		if (ok.getVisibility() == cancel.getVisibility() && ok.getVisibility() == View.VISIBLE) {
			img.setVisibility(View.VISIBLE);
		}
	}
 
	public void setIcon(int res) {
		Drawable d = getResources().getDrawable(res);
 
		setIcon(d);
	}
 
	/**
	 * 設置標題圖片
	 * @param d
	 */
	public void setIcon(Drawable d) {
		int width = d.getIntrinsicWidth();
		int height = d.getIntrinsicHeight();
		boolean flag = width > height;
		int value;
		//判斷圖片是否超過設定大小
		if (WIDTH < (value = flag ? width : height)) {
			Matrix m = new Matrix();
			float degrees = (float)WIDTH / (float)value;
			m.postScale(degrees, degrees);
			Bitmap bmp = ((BitmapDrawable)d).getBitmap();
			bmp = Bitmap.createBitmap(bmp, 0, 0, width, height, m, true);
 
			d = new BitmapDrawable(bmp);
		}
		this.icon.setImageDrawable(d);
	}
 
	public TextView getTitle() {
		return title;
	}
 
	public void setTitle(String text) {
		this.title.setText(text);
	}
 
	public void setTitle(CharSequence ch) {
		this.title.setText(ch);
	}
 
	public void setTitle(int res) {
		this.title.setText(res);
	}
 
	public LinearLayout getContentView() {
		return contentView;
	}
 
	public void setContentView(LinearLayout contentView) {
		this.contentView = contentView;
	}
 
	public void addContentView(View view) {
		this.contentView.addView(view);
	}
 
	public void addContentView(int res) {
		this.contentView.addView(inflater.inflate(res, null));
	}
 
} 


 

MyDialog:

public class MyDialog extends Activity implements OnClickListener{
 
	public static final int BTN1 = R.id.btn1;
	public static final int BTN2 = R.id.btn2;
	public static final int BTN3 = R.id.btn3;
	public static final int BTN4 = R.id.btn4;
 
	private Button mBtn1, mBtn2, mBtn3, mBtn4;
 
	private Dialog mDialog;
	private DialogView mDialogView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        init();
 
        mDialog = new Dialog(this, R.style.FullHeightDialog);
    }
 
    private void init() {
    	mBtn1 = (Button) findViewById(BTN1);
        mBtn2 = (Button) findViewById(BTN2);
        mBtn3 = (Button) findViewById(BTN3);
        mBtn4 = (Button) findViewById(BTN4);
 
        mBtn1.setOnClickListener(this);
        mBtn2.setOnClickListener(this);
        mBtn3.setOnClickListener(this);
        mBtn4.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
    	int id = v.getId();
    	switch(id) {
    	case BTN1:
    		showDialogByValue(BTN1);
    		break;
    	case BTN2:
    		showDialogByValue(BTN2);
    		break;
    	case BTN3:
    		showDialogByValue(BTN3);
    		break;
    	case BTN4:
    		showDialogByValue(BTN4);
    		break;
    	}
 
    }
 
    private void showDialogByValue(int value) {
    	mDialogView = new DialogView(this);
    	mDialogView.setTitle(getString(R.string.title_text));
		mDialogView.setIcon(R.drawable.ic_refresh_holo_dark);
    	switch(value) {
    	case BTN1:
    		mDialogView.setMessage(getString(R.string.message_text));
    		break;
    	case BTN2:
    		mDialogView.setMessage(getString(R.string.message_text));
    		mDialogView.setOkListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Toast.makeText(MyDialog.this, getString(R.string.dlg_ok), Toast.LENGTH_LONG).show();
    				mDialog.dismiss();
    			}
    		});
    		break;
    	case BTN3:
    		mDialogView.setMessage(getString(R.string.message_text));
    		mDialogView.setOkListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Toast.makeText(MyDialog.this, getString(R.string.dlg_ok), Toast.LENGTH_LONG).show();
    				mDialog.dismiss();
    			}
    		});
    		mDialogView.setCancelListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Toast.makeText(MyDialog.this, getString(R.string.dlg_cancel), Toast.LENGTH_LONG).show();
    				mDialog.dismiss();
    			}
    		});
    		break;
    	case BTN4:
    		ListView lv = new ListView(this);
    		ArrayList<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
    		for (int i = 0; i < 10; i++) {
				HashMap<String, Object> map = new HashMap<String, Object>();
				map.put("key", "num " + i);
				list.add(map);
			}
    		SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_1,
    				 new String[]{"key"}, new int[]{android.R.id.text1});
    		lv.setAdapter(adapter);
    		mDialogView.addContentView(lv);
    		break;
    	}
    	mDialog.setContentView(mDialogView);
    	mDialog.show();
    }
 
} 


 

FullHeightDialog:

<resources>
	<style name="FullHeightDialog"
	    parent="android:style/Theme.Dialog">
	    <item name="android:windowFrame">@null</item><!--邊框-->
	    <item name="android:windowNoTitle">true</item>
 	    <item name="android:windowBackground">@drawable/filled_box</item>	<!-- -->
  	</style>
</resources> 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章