I have an Activity that inflates an XML FrameLayout that has a custom View, and a RelativeLayout containing a number of Text/ImageViews:
<?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>
In the custom ‘CanvasView’, I do some drawing, and intercept onTouchEvent(), etc. Based on the user’s actions in the View I’d like to update one of the TextView’s, specifically toolbar_notification. It would be best to do this in the CanvasView itself, but as the TextView is not a childview of it, I can’t access it via findViewById().
I’ve tried this solution, but I get a RuntimeException of “Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class my.package.name.CanvasView” everytime I try to access the parent View’s properties via:
ViewGroup parentView = (ViewGroup) getParent();
parentView.getChildCount();
Any suggestions?
Thanks,
Paul
I would create a Listener interface on your custom Canvas and have your Activity implement it. In your touch event you can call the Listener method and get back into the Activity.
Reasons to do so:
In your custom Canvas:
In your Activity, implement the interface
public class MyActivity extends Activity implements MyCanvas.Listener { ...and set the listener in your onCreate() method in your activity:
myCanvas.setListener(this);Then you can put your TextView-changing code in the callback inside your Activity: