谷歌建議使用DialogFragment來管理對話框,當旋轉屏幕和按下後退鍵時可以更好的管理其聲明週期,它和Fragment有着基本一致的聲明週期。且DialogFragment也允許開發者把AlertDialog作爲內嵌的組件進行重用,類似Fragment(DialogFragment可以在大屏幕和小屏幕顯示出不同的效果,屏幕旋轉相關數據不會被銷燬)
普通自定義1:----------------------------------------------------------------------------------
public class MyDialog1 extends DialogFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//無標題欄
View view = inflater.inflate(R.layout.dialogfragment, container,false);
return view;
}
}
主類:
extends FragmentActivity implements OnClickListener
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_title:
MyDialog1 dialog = new MyDialog1();dialog.show(getSupportFragmentManager(), "tag");break; } }
推薦自定義2:------------------------------------------------------------------------------------
public class MyDialog extends DialogFragment implements OnClickListener{
private EditText et_title;
//自定義接口監聽
public interface OnInputListener {
void onInputComplete(String title);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View views=LayoutInflater.from(getActivity()).inflate(R.layout.dialogfragment, null);
ImageView iv_go = (ImageView) views.findViewById(R.id.ImageView01);
et_title = (EditText) views.findViewById(R.id.et_title);
iv_go.setOnClickListener(this);
AlertDialog.Builder builder =new AlertDialog.Builder(getActivity());
AlertDialog show = builder.show();
show.getWindow().setContentView(views);//自定義佈局
show.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);//寬高
show.getWindow().setGravity(Gravity.TOP);//位置 setLayout
show.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);//支持輸入法show.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
return show;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ImageView01:
OnInputListener listener = (OnInputListener) getActivity();
listener.onInputComplete(et_title.getText().toString());//傳遞值給監聽接口
break;
}
}
}
主類:
extends FragmentActivity implements OnClickListener,OnInputListener
@Override
public void onInputComplete(String title) {
Toast.makeText(this, "title:" +title, Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_title:
MyDialog dialog = new MyDialog();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
dialog.show(ft, "tag");
break;
}
}
使用DialogFragment替代PopupWindow可以解決編輯框不能複製粘貼的bug。。。。。。。。。。。。。。。。。。。
附:輸入法各值的含義:
InputMethodManager im=(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(view.getWindowToken(),0);//隱藏輸入法
stateUnspecified:軟鍵盤的狀態不指定,系統將選擇一個合適的狀態或依賴於主題的設置
stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裏的狀態,無論是隱藏還是顯示
stateHidden:用戶選擇activity時,軟鍵盤是被隱藏
stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
stateVisible:軟鍵盤通常是可見的
stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
當輸入法打亂佈局時可以嘗試在對應的layout XML的頂級元素上加一層ScrollViewAndroid:layout_width="fill_parent"
Android:layout_height="fill_parent">
PopupMenu使用 http://blog.csdn.net/loucyin/article/details/50813439