2011-03-02 21 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()などを傍受する。ビュー内のユーザのアクションに基づいて、TextViewのうちの1つ、特にtoolbar_notificationを更新したいと思う。 CanvasView自体でこれを行うのが最善ですが、TextViewは子ビューではないので、findViewById()でアクセスすることはできません。

私はthis solutionを試しましたが、RuntimeExceptionが発生しました。原因は、android.view.InflateException:バイナリXMLファイル行#5:Error inflating class my.package.name.CanvasViewです。親ビューのプロパティ:

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

お勧めはありますか?

おかげで、

ポール

答えて

3

に役立ちます願っています。タッチイベントでは、Listenerメソッドを呼び出してアクティビティに戻ることができます。そうする

理由:

  • あなたの活動はすでにについてのすべての階層内のビューのを知っています。
  • この方法では、まだあなたの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);

次に、あなたがあなたの活動内でコールバックであなたのTextView変化のコードを置くことができます。

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

にそれを投げて、エラーを出しました。はい、私が探していたものは、魅力のように動作します。 –

0

あなたがNullPointerExceptionを取得する場合、それはあなたがCanvasView内)(getParentを照会している、parentViewnullであることを意味?あなたはActivityでそれをしていますか? あなたのコードはうまくいくはずですが、CanvasViewの内部にあるはずです。

また、CanvasViewcontextActivityにキャストしておきたい子を取得することもできます。 私はこれは私があなたのカスタムキャンバス上のリスナー・インターフェースを作成し、活動がそれを実装する必要があります

+0

申し訳ありませんが、私は(それを編集した)私の元の記事に誤りがありました。エラーはRuntimeExceptionです。はい、私はCanvasViewのコンストラクタでこれをやっています。私はEclipseで "ContextからViewGroupへキャストできません"というエラーが表示され、CanvasViewに渡されたコンテキストをViewGroupにキャストしようとしています。 –

+0

@Paulだから、あなたが親を得ることができなければ、あなたはinflate例外を取得しませんか?別の言葉で、私はまた、ViewGroupにではなく、アクティビティ – raukodraug

関連する問題