2011-12-16 2 views
2

첫 번째 MonoDroid 앱에서는 TextView를 서브 클래스 화하여 각 뷰 (Android - Way to appear bordered text on the TextView?) 주위에 테두리를 표시하고 내 레이아웃 XML (Declaring a custom android UI element using XML)에 추가 할 수 있으며 Android 네임 스페이스의 MonoDroid의 소문자 처리로 인해 NullReferenceExceptions를 얻을 수 있습니다 (Avoiding a NullReferenceException when creating a custom Android UI element from subclassed TextView). 내가 지금 할 노력하고있어 무엇어떻게 활동의 모든 인스턴스를 인스턴스화하지 않고 서브 클래 싱 된 뷰 이벤트를 처리 할 수 ​​있습니까?

enter image description here

각 BorderedTextView 터치 이벤트를 처리합니다.

FindViewById <을 사용하여 각보기를 가져올 수 있으며 각보기의 Click 이벤트를 처리 할 대리자를 만들 수 있음을 알고 있습니다.

enter image description hereenter image description here

BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate); 
currentDate.Click += delegate { 
    Toast toast = Toast.MakeText(this, "CURRENT DATE tapped", ToastLength.Long); 
    toast.Show(); 
} 

BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime); 
startTime.Click += delegate { 
    Toast toast = Toast.MakeText(this, "START TIME tapped", ToastLength.Long); 
    toast.Show(); 
}; 

진일보, I 클릭 수를 처리 BorderedTextView의 일반적인 방법을 만들 수 있음을 촬영 (하지만 여전히 각각의 인스턴스 BorderedTextView 필요).
// In Activity's OnCreate 
BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate); 
currentDate.Click += delegate { 
    BorderedTextView.HandleClicks(this); 
} 

BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime); 
startTime.Click += delegate { 
    BorderedTextView.HandleClicks(this); 
}; 

// In BorderedTextView 
public static void HandleClicks(Context context) 
{ 
    Toast toast = Toast.MakeText(context, "BorderedTextView tapped", ToastLength.Long); 
    toast.Show(); 
} 

는 BorderedTextViews의 수는 달라질 것입니다 때문에 내가 활동의 한 OnCreate에서 각 뷰를 인스턴스화 할 필요없이 클릭 이벤트를 처리하고 싶습니다. Android : clickable 및 android : onClick 속성을 사용하여 레이아웃 XML 파일에서 뭔가를 할 수 있다고 생각했습니다.

<mbta.BorderedTextView 
    android:id="@+id/currentdate" 
    android:text="CURRENT DATE" 
    android:textSize="15pt" 
    android:layout_width="fill_parent" 
    android:layout_height="75dp" 
    android:gravity="center_horizontal|center_vertical" 
    android:layout_weight="1" 
    android:clickable="true" 
    android:onClick="HandleClicks"/> 

그러나이 방법 (Mono Droid onClick event not found)에 등록 이벤트를 지원하지 않습니다 MonoDroid을 끈다.

저는 Xamarin의 API Design 페이지에있는 Events and Listeners 섹션의 정보를 사용하여 SetOnClickListener와보기의 OnTouchEvent 이벤트를 실험했습니다.

내가 원하는 것은 Activity의 OnCreate에서 각보기를 인스턴스화 할 필요없이 BorderedTextView 클래스의 단일 메서드로 모든 BorderedTextView 클릭 이벤트를 처리하는 것입니다. MonoDroid에서이 작업을 수행 할 수 있습니까? 아니면 단순히이 도구가 지원하지 않는 작업을 수행하려고합니다.

미리 감사드립니다.

은 업데이트 - BorderedTextView의 생성자에 이벤트 핸들러를 연결하는 12.16.11

jpobst의 제안했다.

public BorderedTextView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle) 
{ 
    this.Click += delegate { 
     HandleClicks (context); 
    }; 

    this.Tag = this.Text; 
} 

public BorderedTextView(Context context, IAttributeSet attrs) : base(context, attrs) 
{ 
    this.Click += delegate { 
     HandleClicks (context); 
    }; 

    this.Tag = this.Text; 
} 

public BorderedTextView(Context context) : base(context) 
{ 
    this.Click += delegate { 
     HandleClicks(context); 
    }; 

    this.Tag = this.Text; 
} 

그리고 여기가

public static void HandleClicks(Context context) 
{ 
    string typeName = ((Type)this.GetType()).Name; 
    stirng selected = "Selected " + (string)this.Tag + " (" + typeName + ")"; 

    Toast.MakeText(context, selected, ToastLength.Short).Show(); 
} 

답변

3

은 그냥 BorderedTextView 생성자에 이벤트 핸들러를 연결 할 수 없습니다 클릭을 처리 할 수있는 실제적인 방법인가?

+0

고마워요, 그게 효과적이었습니다. (나무가 숲을 보지 못해서 필요한 것보다 더 복잡하게 만들었습니다.) 해결책으로 질문을 업데이트했습니다. – billmaya