2014-12-18 3 views
3

내부 객체를 사용하여 DialogFragment를 사용하여 일부 객체에서 메뉴 아이콘 등을 설정하는 작업을 수행했습니다. Android Studio에 갔을 때 올바르지 않다고 생각했습니다. 정적 인 내부 클래스를 변경하려고했습니다.onCreateView가있는 diff와 DialogFragment의 onCreateDialog이

이렇게하면 Google docs, "doPositiveClick"및 "doNegativeClick"에 따라 onCreateDialog를 사용하여 호출하는 MainActivity가 조각 작업 대신 해당 개체에서 작업을 수행 할 수있게하려고합니다.

return new AlertDialog.Builder(getActivity()) 
       .setTitle(R.string.alert_title) 
       .setMessage(R.string.alert_message) 

       .setPositiveButton(R.string.set, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           ((MainActivity)getActivity()).doPositiveClick(); 
          } 
         } 
       ) 
       .setNegativeButton(R.string.cancel, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           ((MainActivity)getActivity()).doNegativeClick(); 
          } 
         } 
       ) 

을하지만, 이전에 내가 좋아하는 레이아웃을하고 있었다 : 나는 같은 제목, 메시지 및 버튼을 입력 할 수 있습니다 -

무슨 일이 지금은 단편의 레이아웃을 설정 어떻게, 그러나 나를되어 혼란

 final EditText input = new EditText(MainActivity.this); 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20); 
     input.setText("5"); 
     input.setLayoutParams(lp); 
     input.setRawInputType(Configuration.KEYBOARD_QWERTY); 

문제는 어디에서 발생합니까? Google 워드 프로세서는 대화 상자 textView에 텍스트를 설정하는 방법을 보여 주지만 onCreateView() 내에 있습니다.

내 혼란은 Google 문서가 나던 모두를 수행하지 않는다는 것입니다. 즉, 사용자 정의 요소를 설정하는 방법을 보여줄 수없고, MainActivity에서 긍정/부정적인 클릭을 설정하는 것입니다. 미안 지금 당장 볼 수 없어.

위의 onCreateDialog를 사용하여 누구나 나를 분명하게 할 수 있습니다. 어떻게 editText 필드를 가질 수 있으며, 사용자 입력을받는 기본 값으로 처리 한 다음 doPositiveClick()에 그 입력 값을 다시 가져올 수 있습니다.

답변

0

불쌍한 사람들은 내 검색을 다 써 버렸다고 생각했지만 게시 직후에 작성자가 onCreateDialog에 텍스트 필드/레이아웃을 넣고 그 입력에 setView()를 수행하여 수정할 수있었습니다.

 **LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20); 
     final EditText input = new EditText(getActivity()); 
     input.setText("5"); 
     input.setLayoutParams(lp); 
     input.setRawInputType(Configuration.KEYBOARD_QWERTY);** 

     // Use the Builder class for convenient dialog construction 
     return new AlertDialog.Builder(getActivity()) 
       .setTitle(R.string.alert_title) 
       .setMessage(R.string.alert_message) 
       **.setView(input)** 
       .setPositiveButton(R.string.set, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           ((MainActivity)getActivity()).doPositiveClick(); 
          } 
         } 
       ) 

사용자가 입력 한 후에 값을 다시 얻으려면 어떻게해야합니까?

0

DialogFragment는 대화 상자 또는보기의 두 가지 방법으로 사용할 수 있습니다.

case1 :DialogFragment을 대화 상자로 사용하십시오. 대화 상자를 반환하려면 onCreateDialog()을 구현해야합니다. 다음과 같은 방법으로 대화 상자를 표시해야합니다. 예를 참조하십시오

public static class MyAlertDialogFragment extends DialogFragment { 

public static MyAlertDialogFragment newInstance(int title) { 
    MyAlertDialogFragment frag = new MyAlertDialogFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("title", title); 
    frag.setArguments(args); 
    return frag; 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    int title = getArguments().getInt("title"); 

    return new AlertDialog.Builder(getActivity()) 
      .setIcon(R.drawable.alert_dialog_icon) 
      .setTitle(title) 
      .setPositiveButton(R.string.alert_dialog_ok, 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         ((FragmentAlertDialog)getActivity()).doPositiveClick(); 
        } 
       } 
      ) 
      .setNegativeButton(R.string.alert_dialog_cancel, 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         ((FragmentAlertDialog)getActivity()).doNegativeClick(); 
        } 
       } 
      ) 
      .create(); 
} 

}

만들고 다음 방법으로 대화 상자를 표시해야합니다. onCreateView()이 구현되었는지 여부에 관계없이이 방법을 표시하십시오.

// Create the fragment and show it as a dialog. 
DialogFragment newFragment = MyDialogFragment.newInstance(); 
newFragment.show(getFragmentManager(), "dialog"); 

case2 :보기로 사용 (이 대화 상자의 기능이 아닙니다). 그것은 단지보기입니다.

public static class MyDialogFragment extends DialogFragment { 
static MyDialogFragment newInstance() { 
    return new MyDialogFragment(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.hello_world, container, false); 
    View tv = v.findViewById(R.id.text); 
    ((TextView)tv).setText("This is an instance of MyDialogFragment"); 
    return v; 
} 

}

및 다음과 같은보기를 표시해야합니다 : 당신은 onCreateView()를 구현하고 다음과 같은 방법으로 대화 상자를 표시해야합니다. Fragment 클래스 사용과 동일합니다. onCreateDialog()이 구현되었는지 여부에 관계없이이 방법을 표시하십시오.

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
DialogFragment newFragment = MyDialogFragment.newInstance(); 
ft.add(R.id.embedded, newFragment); 
ft.commit(); 

요약 : 디자인 , 당신은 onCreateView()onCreateDialog() 함께 구현이 DialogFragment 라이프 사이클과 같은 소스 코드를 사용할 수 있습니다. 화면이 작 으면 DialogFragment을 대화 상자로 사용하십시오. 화면이 큰 경우 DialogFragment을보기로 사용하십시오 (동일한 일반 Fragment 클래스).

예외를 방지하기 위해 onCreateView()onCreateDialog()과 함께 DialogFragment을 적절하게 표시하는 올바른 방법을 사용하십시오.

관련 문제