Intento de invocar método virtual 'vacío android.widget.ImageView.setVisibility (int)' en una referencia de objeto nulo

Ibramazin:

Tengo 2 archivos de diseño (activity_test.xml) y (content.xml) y un archivo Java (ActivityTest.java)

ActivityTest.java establezca su diseño de contenido a partir de (activity_test.xml) como se muestra

ActivityTest.java

@Override
protected void onCreate(Bundle savedInstanceState) {
.....................

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);

}

activity_test.xml contiene un recyclerView como se muestra

activity_test.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
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="wrap_content"
android:fitsSystemWindows="true"
tools:context=".ActivityTest">

............
some views
...........

<androidx.recyclerview.widget.RecyclerView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/recycler_view2"
 android:layout_marginTop="30dp"
 android:layout_alignParentBottom="true"
 android:scrollbars="vertical"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintHorizontal_bias="0.0"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent"
 app:layout_constraintVertical_bias="0.0"
            />

Tengo un RecyclerViewAdapter que infla el (content.xml) diseño como se muestra

RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

.............
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.content, parent, false);
    return new RecyclerViewAdapter.MyViewHolder(itemView);
}
}

Aquí está el content.xml

content.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".TestActivity">

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

...........

 <ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@+id/save"
  android:src="@drawable/outline_share_black_48dp"
  android:layout_toLeftOf="@+id/savePhoto"
  android:layout_marginTop="5dp"
  android:layout_marginRight="20dp"
  android:clickable="true"
  android:onClick="saveIntent"
            />

El problema - El establecimiento de un detector de clics en el ImageView anterior con el identificador (Guardar) lanza ese error.

ClickEvents tales como - OnClickListener, OnTouchLlistener, setVisibility todos los tiros error - "intento de invocar método virtual 'vacío android.widget.ImageView.setVisibility (int)' en una referencia de objeto nulo"

por ejemplo,

MainActivity.java

..........

private ImageView save_icon;

..........

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);

.............
save_icon = findViewById(R.id.save);
........

public void saveIntent(View view){
    if(view.getId() == R.id.savePhotoIcon){
         save_icon.setImageResource(R.drawable.outline_bookmark_black_48dp);
    }
 }

Quiero cambiar la imagen src de la ImageView a otra imagen onClick

Intenté hacer esto sin xml - (android: hacer clic y android: OnClick) pero todavía tirar thesame error.

Lo más probable es el ID (Guardar) en content.xml devuelve un valor nulo, ya que wasnt't utiliza como el diseño setContentView en onCreate en el archivo MainActivity.Java.

Cuando traté thesame cosa en una vista desde (activity_test.xml), funciona.

Aunque, acciones tales como - Visualización de un mensaje de aviso emergente, nuevo intento funciona todo. p.ej

 public void saveIntent(View view){
    Intent intent = new Intent(ActivityTest.this, AnotherActivity.class);
    startActivity(intent);
}
Vishal Desai:

Esto se debe a que está creando los titulares de visión en tiempo de ejecución usando plantilla de diseño, y se llama a la titular de la vista anterior a la muestra en pantalla. Para ello, hay que ponerlo en práctica en onBindViewHolder:

 public void onBindViewHolder(MyViewHolder holder, int position)
 {
     ImageView imgView=holder.itemview.findViewById(R.id.save);
     imgView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 // Code here executes when user click on save
             }
         });
 }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=301230&siteId=1
Recomendado
Clasificación