0

제목이있는 DialogFragment를 만들고 싶습니다. "Select Wifi"다음에 회 전자가옵니다. 그 아래에 "닉네임 입력"이라는 메시지와 그 아래에 편집 텍스트 필드가 있습니다. 그리고 스피너와 편집 텍스트의 문자열을 반환하는 두 개의 버튼.대화 상자 조각 채우기

public static class MyAlertDialogFragment extends DialogFragment { 

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

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     String title = getArguments().getString("title"); 
     final EditText input = new EditText(getActivity()); 
     final Spinner sp = new Spinner(getActivity()); 

     return new AlertDialog.Builder(getActivity()) 
       .setTitle(title) 
       .setMessage("Select Wifi") 
       .setView(sp) 
       .setMessage("Enter nickname") 
       .setView(input) 
       .setPositiveButton("Save", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((MainActivity)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((MainActivity)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 

그것은 단지 편집 텍스트 파일 편집 텍스트 메시지를 표시합니다 ... 지금까지이 코드를 가지고 있지만, 그것이 작동하지 않는 이유를 알아낼 수 없습니다. 그렇다면 이것을 어떻게 추가 할 수 있습니까? 아니면 여러 메시지가있는 회 전자와 editText를 표시 할 수있는 dialogFragment를 구현하는 더 좋은 방법이 있습니까? 아마도 회 전자에서 힌트를 사용하고 메시지 대신 텍스트를 편집합니까? 또한 메인 클래스의 스피너를 채우고 대화 상자에서 해당 스피너를 사용하는 방법이 있습니까? 어떤 도움을 주셔서 감사합니다.

+0

왜 DialogFragment를 확장하는 사용자 정의 클래스에서 AlertDialog를 반환하겠습니까? xml 파일 및 setcontent view 메소드가있는 활동처럼 사용자 정의 클래스를 사용할 수 있습니다. –

+0

나는 그것을 안드로이드 문서화 사이트를 기반으로 해 보았습니다. 나는 아직도 배우려고 노력하고있다. 회 전자와 editText의 값을 반환하는 간단한 대화 상자가 필요하다면 대신 무엇을 사용해야합니까? 빠른 답변 감사합니다. @IllegalArgument – mtorres

답변

2

당신은에 AlertDialog의 내용에 대한 사용자 정의 레이아웃을 설정 setView() 방법을 사용할 수 있습니다 : 여기 내 응용 프로그램에서이 코드의 스냅 샷입니다.

귀하의 요구에 맞는 레이아웃을 만드십시오. 이 경우 뷰 (메시지, EditText 및 Spinner)가 포함 된 LinearLayout. 다음과 같이 사용할 수 있습니다,의 당신이 그것을 my_dialog.xml라는 가정 해 봅시다 :

사용자 정의보기
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    LayoutInflater inflater = LayoutInflater.from(getActivity()); 
    LinearLayout root = (LinearLayout) inflater.inflate(R.layout.my_dialog, null); 

    // get your Views with findViewById, and initialize them 
    // 
    // Spinner sp = (Spinner) root.findViewById()... 
    // ... 
    // ... 

    return new AlertDialog.Builder(getActivity()) 
     .setTitle(title) 
     .setView(root) 
     .setPositiveButton("Save", 
       new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        // you can access you Views here 
        // and gather the info that you need 

        // you can modify doPositiveClick to 
        // accept that info as parameters 
        // so the parent Activity can get it 
        ((MainActivity)getActivity()).doPositiveClick(param1, param2); 
       } 
      } 
     ) 
     .setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        ((MainActivity)getActivity()).doNegativeClick(); 
       } 
      } 
     ) 
     .create(); 

, 당신은 여전히 ​​등 제목, 양/음 버튼처럼합니다 (에 AlertDialog에 내장 된 기능을 사용할 수 있습니다 ...).

+0

고마워! 이것은 내가 찾고 있던 것이고 우아하고 단순합니다. @ kupsef – mtorres

+0

이것을 구현하려했지만 인플레이터에 오류가 발생했습니다.인수 int를 취할 수 없다는 말을 부풀려 라. 또한 getActivity() 호출로 오류가 발생합니다. 무슨 일이 벌어 질지 상상해? @ kupsef – mtorres

+0

글쎄, inflate 2 paramters 소요, 나는 그에 따라 내 대답을 업데이 트되었습니다. getActivity()로 어떤 오류가 발생합니까? – kupsef

2

매우 간단한 사용자 정의 대화 상자 조각 예제입니다.

public class ClaimDialogFragment extends DialogFragment { 
Button buttonClaim; 
EditText editTextClaim; 
String profileId; 
String status; 
public static ClaimDialogFragment newInstance(Bundle bundle) { 
    ClaimDialogFragment myFragment = new ClaimDialogFragment(); 
    myFragment.setArguments(bundle); 
    return myFragment; 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view = inflater.inflate(R.layout.fragment_dialog_claim, container, 
      false); 
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    getDialog().getWindow().setBackgroundDrawableResource(
      android.R.color.transparent); 
    editTextClaim = (EditText) view.findViewById(R.id.editTextClaim); 
    buttonClaim = (Button) view.findViewById(R.id.buttonClaim); 
    Log.d("point a", editTextClaim.getText().toString() + ""); 
    return view; 
} 
@Override 
public void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    if (getArguments() != null) { 
     profileId = getArguments().getString("profile_id"); 
    } 
    buttonClaim.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
       Toast.makeText(getActivity(), 
         "Please write your claim letter.", 
         Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 
} 

그리고 관련 XML 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/dialog_background" 
    android:orientation="vertical" 
    android:padding="8dp" > 

<EditText 
    android:id="@+id/editTextClaim" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="4dp" 
    android:background="@drawable/edittext_border_background" 
    android:ems="10" 
    android:gravity="top" 
    android:hint="Cover letter for the claim" 
    android:inputType="textMultiLine" 
    android:minLines="5" 
    android:padding="4dp" > 

    <requestFocus /> 
</EditText> 

<Button 
    android:id="@+id/buttonClaim" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/button_black" 
    android:paddingTop="8dp" 
    android:text="/Claim" 
    android:textColor="@color/white" 
    android:textStyle="bold" /> 

이 내가이 대화 조각을 호출하는 방법입니다 :이 코드는 내 애플 리케이션 중 하나입니다

FragmentTransaction ft = getActivity() 
          .getSupportFragmentManager().beginTransaction(); 
        DialogFragment fragment = new ClaimDialogFragment(); 
        fragment.show(ft, null); 

또한 주 그 조각에 newInstance() 정적 메서드를 사용할 수 있습니다. enter image description here

+0

좋아요, 나는 잘못된 방식으로 대화를 생각하고있었습니다. 따라서 xml을 사용하여 뷰를 편집 할 수있는 방법으로 자신의 클래스에 추가하는 것이 좋습니다. – mtorres

+1

대화 상자에는 항상 다른 사람들이 제공하는 클래스 (안드로이드)가 있거나 자신의 것이 될 수있는 클래스가 있습니다. 이것은 자체 클래스에있을 필요는 없지만 코드를 체계적으로 정리하는 것이 좋습니다. 사용자 정의 XML을 제공하면 원하는대로 대화 상자를 스타일링 할 수 있습니다. AlertDialog를 사용할 때는 거의 옵션이 없습니다. –

+2

그 "아주 작은"옵션에 대한 내 대답을 참조하십시오 :) 내 의견으로는 AlertDialog를 사용하는 것이 그것이 제공하는 기능 때문에 훨씬 쉽습니다. (제목, 음수/양수 버튼 처리 등) – kupsef

관련 문제