0

I have multiple Buttons in my app. Now I changed styles from some of them and If I drag (I don't have a drag event configured) I get this error (see stack trace below).

This is the new style I put in the styles file:

<style name="Button.Raised" parent="@style/Widget.AppCompat.Button.Colored">
    <item name="android:height">36dp</item>
    <item name="android:textSize">14sp</item>
    <item name="android:capitalize">characters</item>
    <item name="android:minWidth">64dp</item>
    <item name="android:paddingRight">8dp</item>
    <item name="android:paddingLeft">8dp</item>
    <item name="android:layout_marginLeft">8dp</item>
    <item name="android:layout_marginRight">8dp</item>
</style>

Stacktrace:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.company.appname, PID: 20408
                  java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.Editor$SelectionModifierCursorController.isDragAcceleratorActive()' on a null object reference
                      at android.widget.Editor.updateFloatingToolbarVisibility(Editor.java:1556)
                      at android.widget.Editor.onTouchEvent(Editor.java:1502)
                      at android.widget.TextView.onTouchEvent(TextView.java:10071)
                      at android.view.View.dispatchTouchEvent(View.java:10779)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
                      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:582)
                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1885)
                      at android.app.Activity.dispatchTouchEvent(Activity.java:3240)
                      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:544)
                      at android.view.View.dispatchPointerEvent(View.java:11008)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5162)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5014)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4592)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4558)
                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4691)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4566)
                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4748)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4592)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4558)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4566)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4539)
                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7099)
                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7031)
                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6992)
                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7209)
                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                      at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
                      at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
                      at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7173)
                      at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7236)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:959)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:734)
                      at android.view.Choreographer.doFrame(Choreographer.java:664)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

This is annoying cause it fails even if the button has no event listeners attached (just put a button in the activity and try to drag it), the application crashes. Any idea of what I am doing wrong?

EDIT:

Filtered Source:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.realizar_pago);

    // HERE IS ONE OF THE FAILING BUTTONS
    mostrarPIN = (Button)findViewById(R.id.botonMostrarPIN);
    mostrarPIN.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            // ... some stuff here ...
        }
    });

    // The other failing button has no code, no link only was put in 
    // order to check error. That button is called botonFinanciar in XML Code
}

FULL Source:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.realizar_pago);

    Bundle b = getIntent().getExtras();
    this.importePago = -1; // or other values
    if (b != null){
        this.importePago = b.getInt("importe");
        this.operacion = b.getString("operacion");
    }

    this.listaTarjetas = new ArrayList<TarjetaCredito>();
    this.listaTarjetas = LocalStorageServices.DatabaseService().getTarjetasCredito();
    //DATOS DE PRUEBA DE TARJETAS
    /*
    addTarjeta(1,"VISA Oro", "asdib23rg34", "7294", false);
    addTarjeta(2, "Compras Online", "fibsdijvbasldjv", "4873", false);
    addTarjeta(3, "Tarjeta familia", "534534j5bn54", "5826", true);
    */
    listaTarjetas.add(new TarjetaCredito());

    // Listado de tarjetas y controles asociados a cada una
    RecyclerView rv = (RecyclerView)findViewById(R.id.realizar_pago_tarjetero);
    rv.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
    rv.setLayoutManager(llm);
    adapter = new RVAdapter(this, ponerTarjetaPorDefectoDePrimera(listaTarjetas));
    adapter.setOnRecycleViewClickListener(new RecyclerViewClickListener() {
        @Override
        public void recyclerViewListClicked(View v, int position) {
        TarjetaCredito auxT = listaTarjetas.get(position);
        if(tarjetaSeleccionada == null){
            // NO habia tarjeta seleccionamos la pulsada
            tarjetaSeleccionada = auxT;
            adapter.seleccionarTarjeta(position);
        }else if(tarjetaSeleccionada == auxT){
            // Se ha pulsado sobre la misma tarjeta
            tarjetaSeleccionada = null;
            adapter.deseleccionarTarjeta(position);
        }else{
            // Se ha seleccionado otra tarjeta
            adapter.limpiarSeleccionTarjetas();
            tarjetaSeleccionada = auxT;
            adapter.seleccionarTarjeta(position);
        }
        }
    });
    rv.setAdapter(adapter);

    // Vamos a agregar un observador al adaptador para que lance un evento cuando cambien
    // los datos, es decir, cuando hayan borrado una tarjeta
    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            adapter.seleccionPorDefecto();
        }
    });
    rv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
        //En este punto la vista ha sido construida y podemos marcar la tarjeta por defecto

        //Seleccionamos la tarjeta por defecto
        adapter.seleccionPorDefecto();
        }
    });

    mostrarPIN = (Button)findViewById(R.id.botonMostrarPIN);
    mostrarPIN.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
        final Dialog dialog = new Dialog(context);

        // Verificamos que haya una tarjeta seleccionada
        if(tarjetaSeleccionada != null){
            // Si hay una tarjeta seleccionada tenemos que pedir el PIN al usuario
            // Si no lo ha establecido, en su primera compra le obligamos a establecer un PIN
            if(LocalStorageServices.DatabaseService().userHasSetPin()){
                // Ha establecido PIN, pedimos que lo ponga
            } else {
                // Proceso de selección de PIN
            }
            dialog.setContentView(R.layout.ventana_pin);
            dialog.setTitle("Inserta tu PIN");
            final EditText pinText = (EditText)dialog.findViewById(R.id.textPin);

            Button dialogButtonPin = (Button) dialog.findViewById(R.id.botonDialogoComprobarPin);
            Button dialogButtonCancel = (Button) dialog.findViewById(R.id.botonDialogoCancelar);
            dialogButtonPin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            dialogButtonCancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.cancel();
                }
            });

            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
            dialog.show();
            // Ponemos el foco en la caja del pin y abrimos el teclado
            pinText.requestFocus();
        }else{
            // Mostramos diálogo de confirmación
            AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppThemeDialogs);
            builder.setIcon(android.R.drawable.ic_dialog_alert);
            builder.setTitle("Error de tarjeta");
            builder.setMessage("Para realizar un pago tienes que seleccionar una tarjeta.");
            builder.setPositiveButton("Aceptar", null);
            builder.show();
        }
        }
    });
}

Is not finished yet. Any case, the error comes when I put the style Button.Raised to the buttons and long press then drag it.

The XML of the activity:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/fondo_pantalla"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textoTitulo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/white_title"
            android:gravity="center"
            android:text="SELECCIONA TU TARJETA"
            android:textAlignment="center"
            style="@style/Typos.Headline"/>

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

            <android.support.v7.widget.RecyclerView
                android:id="@+id/realizar_pago_tarjetero"
                android:scrollbars="none"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@color/barraChat"
                android:orientation="horizontal"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:paddingTop="5dp">

            <TextView
                android:id="@+id/textoImporte"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/white_title"
                android:gravity="center"
                android:text="7€"
                android:textAlignment="center"
                style="@style/Typos.Headline"/>

            <Button
                android:id="@+id/botonMostrarPIN"
                style="@style/Button.Raised"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
               android:layout_marginTop="@dimen/activity_vertical_margin"
                android:text="Pagar ya" />
        </LinearLayout>

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="5dp">

            <Button
                android:id="@+id/botonFinanciar"
                style="@style/Button.Raised.BlueAbanca"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Financiar"
                android:backgroundTint="#ff5b87da"
                app:backgroundTint="#ff5b87da"
                app:layout_constraintBottom_toTopOf="@+id/imageView4"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />

            <android.support.v7.widget.AppCompatImageView
                android:id="@+id/imageView4"
                android:layout_width="139dp"
                android:layout_height="28dp"
                android:layout_marginBottom="8dp"
                android:layout_marginEnd="8dp"
                android:visibility="visible"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:srcCompat="@drawable/ic_abanca" />

        </android.support.constraint.ConstraintLayout>
    </LinearLayout>
Javier Torron Diaz
  • 347
  • 1
  • 4
  • 25

1 Answers1

1

This is weird question but maybe you should try with clean and rebuild project and check initialization of your fields

  • I did a clean and rebuild with the same result. What you mean with the initialization of my fields? Your answer gives not a clue. – Javier Torron Diaz Jan 09 '18 at 14:32
  • By initialization of fields I though maybe you didn't find button view ids correctly,but maybe if your provide some code lines and xml it would be easier to help,also maybe this would help you if the error only occurs when you style your button https://stackoverflow.com/questions/2410836/how-do-i-apply-a-style-to-all-buttons-of-an-android-application – thisactuallyworks Jan 09 '18 at 14:51
  • Ok, it was what I thinking, but I thought it was too direct. See my edit (I will post filtered code of the OnCreate method where I call the IDs and the XML, if you need complete code ask me please). – Javier Torron Diaz Jan 09 '18 at 15:09
  • I've just run your code without any problems,send me your full code pls – thisactuallyworks Jan 09 '18 at 15:36
  • Copy/Pasted it on my question. I mean the OnCreate Method (can't provide full length code of all the application). – Javier Torron Diaz Jan 09 '18 at 15:42
  • Can't really understand what do you want It's pretty unclear,so if you want discuss more send me your questions or code snapshots of error on email: alenmalik43@gmail.com – thisactuallyworks Jan 09 '18 at 15:59
  • What I want is to understand and fix the `java.lang.NullPointerException` preventing it on my app, and in another apps. I mail you if you want, but I don't know what code you want, I have no code for that event: I do not listen for drag events, so I can't send you the code. Thats why I am asking about this weird exception. – Javier Torron Diaz Jan 09 '18 at 16:07
  • The thing is that i run your code with that button and layout and there s no any error with it – thisactuallyworks Jan 09 '18 at 16:19