0

I am facing quite a weird problem with listeners set on buttons inside an Array list. I have a for loop which does not seem to work. Whatever button I hit makes the app crash. The code below has only one button defined and despite of this it does not do the job... What am I doing wrong ?

XML layout

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:rowCount="20"
    android:columnCount="9">

    <Button
        android:id="@+id/jeton1"
        android:layout_column="0"
        android:layout_row="0"
        android:text="@string/boutona"
        android:layout_height="88dp"
        android:layout_width="88dp"
        android:textSize="40sp"
        android:backgroundTint="#eeceac"
        android:textStyle="bold" />

Main Java class

public class MainActivity extends AppCompatActivity {

// Step 1 Array creation
private static final int[] idArray = {R.id.jeton1};

// Step 2 Set
private Button[] jeton = new Button[idArray.length];

int i;

@SuppressLint("ClickableViewAccessibility")
@Override

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Step 3 Assign array objects to buttons

    for (i=0; i <idArray.length ; i++){
        jeton[i] = (Button)findViewById(idArray[i]);

        // Step 4 Action listener

        jeton[i].setOnTouchListener(
                new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent event) {
                        switch (event.getAction()) {
                            case MotionEvent.ACTION_UP:
                                jeton[i].getBackground().setAlpha(0); // Crashes the app
                                jeton[i].setTextColor(Color.parseColor("#2aa17b"));
                                break;
                                                       }
                        return true;
                    }

    });

}

}}

The line : jeton[i].getBackground().setAlpha(0); causes the app to crash

(java.lang.ArrayIndexOutOfBoundsException: length=1; index=1)

Logcat log :

07-30 16:39:41.686 3964-3964/com.example.namour.combiendejetons W/art: Before Android 4.1, method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView

07-30 16:39:41.714 3964-3964/com.example.namour.combiendejetons I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@25c2780e time:76491516 07-30 16:39:44.172 3964-3964/com.example.namour.combiendejetons I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN 07-30 16:39:44.201 3964-3964/com.example.namour.combiendejetons I/ViewRootImpl: ViewRoot's Touch Event : ACTION_POINTER_DOWN(1) 07-30 16:39:44.228 3964-3964/com.example.namour.combiendejetons I/ViewRootImpl: ViewRoot's Touch Event : ACTION_POINTER_UP(1) 07-30 16:39:44.273 3964-3964/com.example.namour.combiendejetons I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP 07-30 16:39:44.291 3964-3964/com.example.namour.combiendejetons E/InputEventReceiver: Exception dispatching input event. 07-30 16:39:44.292 3964-3964/com.example.namour.combiendejetons E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 07-30 16:39:44.302 3964-3964/com.example.namour.combiendejetons E/MessageQueue-JNI: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at com.example.namour.combiendejetons.MainActivity$1.onTouch(MainActivity.java:45) at android.view.View.dispatchTouchEvent(View.java:8389) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2376) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1727) at android.app.Activity.dispatchTouchEvent(Activity.java:2783) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2337) at android.view.View.dispatchPointerEvent(View.java:8585) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4074) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3940) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3485) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3538) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3504) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3512) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3485) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3538) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3504) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3614) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3512) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3671) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3485) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3538) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3504) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3512) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3485) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5759) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5733) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5704) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5878) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:143) at android.os.Looper.loop(Looper.java:122) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 07-30 16:39:44.302 3964-3964/com.example.namour.combiendejetons D/AndroidRuntime: Shutting down VM 07-30 16:39:44.304 3964-3964/com.example.namour.combiendejetons E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.namour.combiendejetons, PID: 3964 java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at com.example.namour.combiendejetons.MainActivity$1.onTouch(MainActivity.java:45) at android.view.View.dispatchTouchEvent(View.java:8389) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)

Many thanks for your replies

alhambra60
  • 11
  • 3
  • Have you tried debugging using a debugging environment? Like the debug environment of an IDE. If you know which line causes your code to crash, then set breakpoints before that and observe what's going on. Check the values of each of your variables, see what is miscalculated before the point of failure. You're halfway there, you know where your code crashes. If I had to guess, I'd say that something doesn't look right with the way you create your arrays in the first place: private static final int[] idArray = {R.id.jeton1}; private Button[] jeton = new Button[idArray.length]; – Soutzikevich Jul 30 '18 at 21:49
  • Thanks for your comments, I tried to test it with Public Button ... but it still does not work.I will give it a try another way, this will be the matter of another new post. – alhambra60 Jul 31 '18 at 20:36
  • You are welcome. The compiler says it clearly, you are trying to get elements from an array, that don't exist. In this case, your array has size of 1. So you initialize it with only 1 element. Find what happens when you add elements in your array. That's why I insist on using a debug environment, you will make your life easier. – Soutzikevich Aug 01 '18 at 05:57

0 Answers0