0

This is my view's XML file:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/bsv_edit_beaconname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Beacon Name" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <CheckBox
        android:id="@+id/bsv_check_fix"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/cinit_table_isfixpoint" />

    <CheckBox
        android:id="@+id/bsv_check_draw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/cinit_table_drawbeacon" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:orientation="horizontal">

    <Button
        android:id="@+id/bsv_btn_setpos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="set_position_click"
        android:text="@string/cinit_set_position" />

    <TextView
        android:id="@+id/bsv_text_pos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Position ?" />
</LinearLayout>

With the corresponding java class being the following

package talogs.beacontalogs;

import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;


public class BeaconSetupView extends LinearLayout {

    private static final String TAG = "BeaconSetupView";

    private EditText edit_beaconName;
    private CheckBox check_isFixpoint;
    private CheckBox check_draw;
    private Button btn_setpos;
    private TextView text_pos;

    public BeaconSetupView(Context context) {
        this(context, null);
    }

    public BeaconSetupView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public BeaconSetupView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public void init(Context context) {
        // inflate(getContext(), R.layout.beacon_setup_view, this);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate( R.layout.beacon_setup_view, this );

        edit_beaconName = (EditText) findViewById(R.id.bsv_edit_beaconname);
        check_isFixpoint = (CheckBox) findViewById(R.id.bsv_check_fix);
        check_draw = (CheckBox) findViewById(R.id.bsv_check_draw);
        btn_setpos = (Button) findViewById(R.id.bsv_btn_setpos);
        text_pos = (TextView) findViewById(R.id.bsv_text_pos);
    }

    public void setPosition(Point point) {
        Log.v(TAG, "setting position to " + point.toString());
        text_pos.setText(String.format("(%d, %d)", point.x, point.y));
    }
}

My custom view BeaconSetupView is created programmatically using this code when a button in an activity is pressed.

public void btn_addbeacon_Click(View view) {
    BeaconSetupView beacon = new BeaconSetupView(this);
    beaconList.addView(beacon, beaconList.getChildCount() - 1);
}

The button that's part of the custom view calls this method:

public void set_position_click(View view) {
    ViewParent parent1 = view.getParent();
    ViewParent parent2 = parent1.getParent();

    BeaconSetupView bsv = (BeaconSetupView) view.getParent().getParent();
    Log.v(LOG_TAG, "set_position called, point is currently " + String.valueOf(lastClicked));
    if (lastClicked != null) {
        bsv.setPosition(lastClicked);
    }
}

The problem is that the button click cannot be implemented outside of the root activity (because it has data that I need), but I also need to get its corresponding BeaconSetupView. Calling view.getParent().getParent() and casting it results in a ClassCastException. So I tried changing the root element of the XML layout to BeaconSetupView, but that causes the app to crash when the view is first added to the activity.

I either need a way to cast my custom class properly and still be able to add it programmatically to my activity, or I need to be able to access the activity's instance from another class that doesn't have a reference to it. What are my options?

user3340459
  • 435
  • 5
  • 13
  • Try this using interface – MashukKhan May 01 '18 at 18:18
  • @MashukKhan if you mean adding my view in the editor/xml file manually, that's not an option because I need to create these views on the fly (variable amounts) – user3340459 May 01 '18 at 18:22
  • Interface is not related with xml, check this example https://stackoverflow.com/a/18585099/3669559 – Oğuzhan Döngül May 01 '18 at 18:29
  • I don't know why, but defining the on click listener like that just didn't occur to me. That did the trick! However you also need to set the custom views root element to `android:clickable="false"` or the `OnClickListener` will not be called. Another fix seems to be just calling `getParent()` three times instead of only twice. – user3340459 May 01 '18 at 18:50

0 Answers0