Android 自定義DialogFragment替代popupwindow

谷歌建議使用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的頂級元素上加一層ScrollView
<ScrollView xmlns:Android="http://schemas.android.com/apk/res/android " 
        Android:layout_width="fill_parent" 
        Android:layout_height="fill_parent"> 
</ScrollView>

PopupMenu使用 http://blog.csdn.net/loucyin/article/details/50813439



發佈了42 篇原創文章 · 獲贊 68 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章