-1

레이아웃이 EditText 요소 만 포함하는 사용자 정의 DialogFragment가 있습니다.DialogFragment 레이아웃의 뷰 요소는 id로 액세스 할 수 없습니다.

레이아웃 :

<?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:orientation="vertical"> 

    <EditText 
     android:id="@+id/reminder" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/reminder_message" 
     android:inputType="text" /> 
</LinearLayout> 

코드 :

public class ReminderDialog extends DialogFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_reminder, container, false); 
     return rootView; 
    } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 
     super.onDismiss(dialog); 
     if (onDismissListener != null) { 
     String text = (String) ((TextView) (rootView.findViewById(R.id.reminder))).getText(); 
     onDismissListener.onDismiss(text); 
     } 
    } 

그것은 응용 프로그램 모듈에서 잘 작동한다. 그러나 나는 도서관 모듈에 들어가기를 원한다. 하지만 그때 나는 오류를 디버깅했습니다. 그것은 R.id.reminder가 0이기 때문입니다.

어쨌든 요소에 액세스 할 수 있습니까?

+0

뭘 하시겠습니까? ondismiss에서 액세스하는 이유 –

+0

지도 마커의 InfoWindow를 길게 누르면 EditText 요소가있는 DialogFragment가 열립니다. 제출 버튼을 원하지 않습니다. 사용자가 대화 상자를 닫으면 InfoWindow에 텍스트가 설정됩니다. –

답변

0

봅니다 getDialog()를 사용합니다. 대신 rootView.findViewById의 findViewById를() (R.id.reminder를)

**

편집

**

사용해보기

Resources.getIdentifier(...)

당신은

의 GetResources() 할 수 getIdentifier ("RES_NAME", "res_type", "com.library.package을."); 귀하의 경우에는

:

R.id.reminder은 다음과 같습니다.

의 GetResources() getIdentifier ("알림", "ID", "com.library.package");

+0

getDialog()가 null을 반환 함 –

+0

R.id.remainder가 0이되기 때문에 작동하지 않습니다 –

+0

[Resource.getIdentifier (...)] (http://developer.android.com/reference /Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29) getResources()를 사용할 수 있습니다. getIdentifier ("res_name", "res_type ","com.library.package "); 귀하의 경우 : R.id.reminder는 다음과 같습니다. getResources(). getIdentifier ("reminder", "id", "com.library.package"); –

0

봅니다 제공되는 대화 상자 인스턴스를 캐스팅 한 후 리뷰를 찾을 수 :

((Dialog) dialog).findViewById(R.id.reminder); 

가 해결해야 사용중인 대화의 적절한 유형에 있지만 일반적으로 대화에 캐스팅하는 것을 잊지 마십시오.

+0

R.id.remainder가 0이되기 때문에 작동하지 않습니다. –

0

onCreateView 메서드는 DialogFragments에는 쓸모가 없습니다.
당신은 오버라이드 (override) : Ognev Zair는 지적

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = new Dialog(getActivity(), null); 
    dialog.setContentView(R.layout.fragment_reminder); 
    return dialog; 
} 

그런 다음, 당신이 getDialog()를 사용할 수 있습니다

String text = (TextView) (getDialog().findViewById(R.id.reminder))).getText().toString(); 
+0

R.id.remainder가 0이되기 때문에 작동하지 않습니다. –

0

는 또한 솔루션을 체크 아웃. 뷰 ID에는 아무런 문제가 없습니다! 그것이 있으면 로컬 설정과 관련됩니다. 따라서 다음을 실행하십시오.

gradlew clean 

다음 프로젝트를 다시 빌드하십시오.

06-19 : 10 : 38 : 29.602 7974-7974/com.palup.locationalert E/AndroidRuntime : 내가 가진 유일한 오류가 텍스트 입력을 검색 할 때 당신이하고있는 잘못된 캐스트 관련이 FATAL 을 예외 : 주요 프로세스 : com.palup.locationalert, PID : 7974 java.lang.ClassCastException가 : android.text.SpannableStringBuilder 가 com.palup.library.fragment.ReminderDialog에서 java.lang.String의 으로 캐스팅 할 수 없습니다. onDismiss (ReminderDialog.java:47) android.app.Dialog $ ListenersHandler.handleMessage (Dialog.java:1323)android.app.ActivityThread.main에서 android.os.Looper.loop (Looper.java:148) 에서 android.os.Handler.dispatchMessage (Handler.java:102) (ActivityThread.java:5417) 에서에서 com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) 에서 java.lang.reflect.Method.invoke (기본 방법) (ZygoteInit.java:616)

그래서 그냥 ReminderDialog 내에서 코드 업데이트 :

@Override 
public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 
    if (onDismissListener != null) { 
     String text = ((EditText) (rootView.findViewById(R.id.reminder))).getText().toString(); 
     onDismissListener.onDismiss(text); 
    } 
} 
관련 문제