2011-03-02 4 views
2

나는 사용자 정의보기가있는 XML의 FrameLayout이를 팽창 액티비티, 및 텍스트/ImageViews의 숫자가 포함 된 RelativeLayout의이 : 사용자 정의 'CanvasView'에서안드로이드 : 형제 볼 수있는 권한

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <my.package.name.CanvasView 
     android:id="@+id/canvas" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:focusable="true" /> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="24dp" 
     android:background="#66000000"> 
    <TextView 
     android:id="@+id/toolbar_time" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:gravity="right|center_vertical" 
     android:textColor="#FFFFFFFF" 
     android:shadowColor="#000000" 
     android:shadowDx="1" 
     android:shadowDy="1" 
     android:shadowRadius="2" /> 
    <ImageView 
     android:id="@+id/toolbar_notification" 
     android:layout_toLeftOf="@+id/toolbar_time" 
     android:layout_width="20dp" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:gravity="center|center_vertical" /> 
    <TextView 
     android:id="@+id/toolbar_title" 
     android:layout_toLeftOf="@+id/toolbar_notification" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:gravity="left|center_vertical" 
     android:singleLine="true" 
     android:ellipsize="marquee" 
     android:textColor="#FFFFFFFF" 
     android:shadowColor="#000000" 
     android:shadowDx="1" 
     android:shadowDy="1" 
     android:shadowRadius="2" /> 
    </RelativeLayout> 
</FrameLayout> 

을, I 일부 드로잉을 수행하고 onTouchEvent() 등을 가로 채기. View의 사용자 작업에 따라 TextView 중 하나, 특히 toolbar_notification을 업데이트하고 싶습니다. CanvasView 자체에서이 작업을하는 것이 가장 좋겠지 만 TextView는 하위 뷰가 아니기 때문에 findViewById()을 통해 액세스 할 수 없습니다.

나는 this solution을 시도했지만, 액세스 할 때마다 "원인 : android.view.InflateException : 이진 XML 파일 줄 # 5 : 클래스를 확장하는 중 오류가 발생했습니다."라는 RuntimeException이 발생합니다. 부모보기 속성 :

ViewGroup parentView = (ViewGroup) getParent(); 
parentView.getChildCount(); 

의견이 있으십니까?

감사합니다,

답변

3

사용자 정의 Canvas에 Listener 인터페이스를 만들고 액티비티를 구현하도록합니다. 터치 이벤트에서 Listener 메서드를 호출하고 Activity로 돌아갈 수 있습니다.

이유는 이렇게하는 :

  • 귀하의 활동이 이미에 대한 모든 계층의 견해를 알고있다.
  • 이 방법은 TextView가 돌아 다니더라도 계속 작동합니다.
  • 프레임 워크는 사용자 정의 캔버스에

작동하는 방식에 일관성이 : 당신의 활동에

public static interface Listener { 
    public void someEventHappened(String moreInfo); 
} 

private Listener listener; 

public void setListener(Listener listener) { this.listener = listener; } 

을, 인터페이스

public class MyActivity extends Activity implements MyCanvas.Listener { ...

를 구현하고있는 리스너를 설정 귀하의 활동에서 귀하의 onCreate() 메소드 :

myCanvas.setListener(this);

그럼 당신은 당신의 활동 내부 콜백에 텍스트 뷰 변화하는 코드를 넣을 수 있습니다 :

public void someEventHappened(String moreInfo) { 
    TextView myTextView = (TextView) findViewById(R.id.my_text_view); 
    myTextView.setText(moreInfo); 
} 
+1

예, 내가 찾고 있던 것이 참으로 매력적이다. –

0

당신이 parentViewnull 것을 의미 NullPointerException 얻을 경우, 당신은 CanvasView 내부 getParent()를 쿼리하는? 또는 Activity에서 하시겠습니까? 작동해야하는 코드가 있지만 CanvasView 안에 있어야합니다.

또한 CanvasViewcontextActivity에 넣고 시도해 볼 수 있습니다. 그러면 원하는 자식을 얻을 수 있습니다. 이 도움이 되었기를 바랍니다.

+0

죄송합니다, 나는 (그것을 편집 한) 내 원래의 게시물에 잘못되었습니다; 오류는 RuntimeException입니다. 예, CanvasView의 생성자에서이 작업을 수행하고 있습니다.이클립스에서 Context에서 ViewGroup으로 캐스트 할 수 없다는 오류가 발생하여 CanvasView로 전달 된 컨텍스트를 ViewGroup으로 캐스팅하려고합니다. –

+0

@Paul 그래서 부모님을 얻지 못한다면 부 풀리지 예외가 발생하지 않습니까? 또 다른 메모에서, 나는 또한 오류를 만들었지 만, ViewGroup이 아닌 Activity로 가져 가라. – raukodraug

관련 문제