2

xamarin을 사용하여 C#에서 custom DialogPreference을 구현했지만 xml 파일에 추가하는 데 문제가 있습니다.xml 파일에 사용자 정의 DialogPreference 추가하기

namespace Client.Android 
{ 
public class TimePreference : DialogPreference 
{ 
    private int lastHour = 0; 
    private int lastMinute = 0; 
    private TimePicker picker = null; 

    public static int GetHour(string time) 
    { 
     string[] pieces = time.Split (':'); 
     return Convert.ToInt32 (pieces [0]); 
    } 

    public static int GetMinute(string time) 
    { 
     string[] pieces = time.Split (':'); 
     return Convert.ToInt32 (pieces [1]); 
    } 

    public TimePreference(Context context, IAttributeSet attSet) : base(context, attSet) 
    { 
     SetPositiveButtonText (Resource.String.time_preference_set); 
     SetNegativeButtonText (Resource.String.time_preference_cancel); 
    } 

    protected override View OnCreateDialogView() 
    { 
     picker = new TimePicker (Context); 
     return picker; 
    } 

    protected override void OnBindDialogView (View view) 
    { 
     base.OnBindDialogView (view); 
     picker.CurrentHour = (Java.Lang.Integer) lastHour; 
     picker.CurrentMinute = (Java.Lang.Integer) lastMinute; 
    } 

    protected override void OnDialogClosed (bool positiveResult) 
    { 
     base.OnDialogClosed (positiveResult); 

     if (positiveResult) { 
      lastHour = (int) picker.CurrentHour; 
      lastMinute = (int) picker.CurrentMinute; 

      string time = lastHour + ":" + lastMinute; 

      if (CallChangeListener (time)) { 
       PersistString (time); 
      } 
     } 
    } 

    protected override Java.Lang.Object OnGetDefaultValue (TypedArray a, int index) 
    { 
     return a.GetString (index); 
    } 

    protected override void OnSetInitialValue (bool restorePersistedValue, Java.Lang.Object defaultValue) 
    { 
     string time = string.Empty; 

     if (restorePersistedValue) { 
      if (defaultValue == null) { 
       time = GetPersistedString ("00:00"); 
      } else { 
       time = GetPersistedString (defaultValue.ToString()); 
      } 
     } else { 
      time = defaultValue.ToString(); 
     } 

     lastHour = GetHour (time); 
     lastMinute = GetMinute (time); 
    } 
} 
} 

내 프로젝트 이름/기본 네임 스페이스는 "Client.Android"내가 그렇게처럼 내 xml 파일에 추가 시도했다 :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
    <PreferenceCategory android:title="@string/pref_foo" > 
    ... 

    <Client.Android.TimePreference 
     android:title="@string/pref_bar" 
     android:key="@string/prefkey_bar" 
     android:defaultValue="12:00" /> 
    ... 
    </PreferenceCategory> 
</PreferenceScreen> 

하지만 난의 AddPreferencesFromResource(Resource.Xml.settings);에 다음과 같은 예외가 내 OnCreate 방법 :

Android.Views.InflateException: Binary XML file line #32: Error inflating class Client.Android.TimePreference 
    at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue[]) [0x00084] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/7f0e3d3c/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:895 
    at Android.Preferences.PreferenceActivity.AddPreferencesFromResource (int) [0x00070] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/7f0e3d3c/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Preferences.PreferenceActivity.cs:729 
    at Client.Android.SettingsActivity.OnCreate (Android.OS.Bundle) [0x00015] in c:\pushtotalk\Client.Android\SettingsActivity.cs:45 
    at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.12-series/7f0e3d3c/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.App.Activity.cs:2178 
    at at (wrapper dynamic-method) object.7c9f4d4d-9496-4803-b019-cd453beeee8b (intptr,intptr,intptr) <IL 0x00017, 0x00043> 
    at --- End of managed exception stack trace --- 
    at android.view.InflateException: Binary XML file line #32: Error inflating class Client.Android.TimePreference 
    at at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:441) 
    at at android.preference.GenericInflater.rInflate(GenericInflater.java:481) 
    at at android.preference.GenericInflater.rInflate(GenericInflater.java:493) 
    at at android.preference.GenericInflater.inflate(GenericInflater.java:326) 
    at at android.preference.GenericInflater.inflate(GenericInflater.java:263) 
    at at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272) 
    at at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:1472) 
    at at client.android.SettingsActivity.n_onCreate(Native Method) 
    at at client.android.SettingsActivity.onCreate(SettingsActivity.java:32) 
    at at android.app.Activity.performCreate(Activity.java:5231) 
    at at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
    at at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
    at at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at at android.os.Handler.dispatchMessage(Handler.java:102) 
    at at android.os.Looper.loop(Looper.java:136) 
    at at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at at java.lang.reflect.Method.invokeNative(Native Method) 
    at at java.lang.reflect.Method.invoke(Method.java:515) 
    at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at at dalvik.system.NativeStart.main(Native Method) 
    at Caused by: java.lang.ClassNotFoundException: Didn't find class "Client.Android.TimePreference" on path: DexPathList[[zip file "/data/app/Client.Android-1.apk"],nativeLibraryDirectories=[/data/app-lib/Client.Android-1, /vendor/lib, /system/lib]] 
    at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at at java.lang.ClassLoader.loadClass(ClassLoader.java:497) 
    at at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 
    at at android.preference.GenericInflater.createItem(GenericInflater.java:375) 
    at at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:430) 
    at ... 22 more 

답변

4

이들은있는 default attributes 가능 (또한 Inherited XML Attributes 블록 I을 확장하여 상속 된 속성을 볼 수 있습니다 n은 android docs for DialogPreference) :

android:dialogIcon - The icon for the dialog. 
android:dialogLayout - A layout to be used as the content View for the dialog. 
android:dialogMessage - The message in the dialog. 
android:dialogTitle - The title in the dialog. 
android:negativeButtonText - The negative button text for the dialog. 
android:positiveButtonText - The positive button text for the dialog. 

그래서 당신은 당신이 Stylable의 정의 자신의 Resource 파일을 만들 필요가 자신의 속성을 사용하기 위해 당신의 DialogPreference 같은 :

자원 \ 값 \ MyTimePreferenceAttrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyTimePreference"> 
     <attr name="defaultValue" format="string"/> 
    </declare-styleable> 
</resources> 

그런 다음 당신이 당신의 TimePreference보기를 만들려면 AXML 레이아웃에 당신은 네임 스페이스를 추가 할 필요가 그들이 할 수 있도록 해결 :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:my="http://schemas.android.com/apk/res-auto" > 
    <PreferenceCategory android:title="@string/pref_foo" > 
    ... 

    <Client.Android.TimePreference 
     my:defaultValue="12:00" /> 
    ... 
    </PreferenceCategory> 
</PreferenceScreen> 

그런 다음 TimePreference의 생성자에서이 같은 뭔가 값을 얻을 수있는 것은 :

var ta = context.ObtainStyledAttributes(attrs, Resource.Styleable.MyTimePreference); 
var defaultValue = ta.GetString(Resource.Styleable.MyTimePreference_defaultValue); 
ta.Recycle(); 

또한 XML 레이아웃에서 대문자 네임 스페이스를 사용에 문제가있을 수 있습니다. 그러나 클래스 이름은 대문자로 유지됩니다.

<client.android.TimePreference 
    ... 
+0

사용자 정의 클래스를 사용하여 값을 설정할 때'OnSharedPreferencesChanged' 이벤트가 발생하지 않는 이유는 무엇입니까? 그것은 다른 모든 환경 설정을 위해 작동하므로 청취자를 설정해야합니다. –

+0

내 실수는 효과가있다. –