problema Null-pointer la visualizzazione di un'immagine da attività cartella di Android 2.2 SDK
-
27-09-2019 - |
Domanda
Ho guardato il 2 esempi sulla pila, ma non può andare al lavoro. Sto semplicemente cercando di catturare un'immagine da una cartella in attività e impostarlo come in ImageView, ma ottenere un puntatore nullo restituito. Che cosa sto facendo di sbagliato?
attività principale: pacchetto com.xxx.xxx;
import java.io.InputStream;
import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class SamplesViewFlipper extends SamplesViewCreator {
private Bitmap returnedImage;
ImageView imgView;
ViewFlipper vf;
private String imageName = "testImage.png";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
returnedImage = getImageFromAsset(imageName);
imgView = (ImageView) findViewById(R.id.dynamicImageView);
imgView.setImageBitmap(returnedImage); //<-null pointer happens here
vf = (ViewFlipper) findViewById(R.id.SamplesViewFlipper);
setContentView(R.layout.view_flipper_samples);
}
public void buttonClickHandler(View view) {
switch (view.getId()) {
case R.id.nextSampleButton:
vf.showNext();
break;
case R.id.backSampleButton:
vf.showPrevious();
break;
}
}
}
Extender Classe:
package com.xxx.xxx;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class SamplesViewCreator extends Activity {
private InputStream is;
private Bitmap bitmap;
public Bitmap getImageFromAsset(String imageName) {
AssetManager mngr = getAssets();
try {
is = mngr.open("file:///android_asset/Samples/" + imageName);
bitmap = BitmapFactory.decodeStream(is);
//also tried "Files/" + imageName per example on Stack
} catch (final IOException e) {
e.printStackTrace();
}
return bitmap;
}
}
e le mie due file XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/SamplesLayout"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/samples_menu"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:gravity="center"
android:background="#0061F9">
<Button android:id="@+id/nextSampleButton"
android:layout_marginRight="10dp"
android:gravity="center"
android:layout_width="50dp"
android:layout_height="30dp"
android:text="Next"
android:textColor="#FFFFFF"
android:textSize="13dp"
android:layout_weight="1"
android:background="@drawable/button"
android:layout_alignParentRight="true"
android:onClick="buttonClickHandlerSamples"/>
<Button android:id="@+id/backSampleButton"
android:layout_marginLeft="10dp"
android:gravity="center"
android:layout_width="50dp"
android:layout_height="30dp"
android:text="Back"
android:textColor="#FFFFFF"
android:textSize="13dp"
android:layout_weight="1"
android:background="@drawable/button"
android:onClick="buttonClickHandler"/>
</RelativeLayout>
<LinearLayout android:id="@+id/SamplesViewFlipperLayout"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<ViewFlipper android:id="@+id/SamplesViewFlipper"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<!--adding views to ViewFlipper-->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="@dimen/header_pad_left"
android:paddingRight="@dimen/header_pad_right"
android:paddingBottom="@dimen/header_pad_bot"
android:paddingTop="@dimen/header_pad_top"
android:orientation="vertical"
android:background="@color/background" >
</LinearLayout>
</ViewFlipper>
</Linear
Layout>
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dynamicImageView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/default_samples_image"/>
EDIT:
provato anche questo, ma ancora ottenere un file non trovato eccezione.
Public Bitmap getImageFromAsset() throws IOException {
try {
is = getAssets().open("test3.png");
bitmap = BitmapFactory.decodeStream(is);
} catch (final IOException e) {
e.printStackTrace();
}
System.out.println("bitmap is " + bitmap);
return bitmap;
}
Soluzione
In caso di "file:///android_asset/Samples/" + imageName
proviene? Se il tuo aspetto di gerarchia come attività / file_name.jpg, si sarebbe solo chiamare open(file_name.jpg)
. In altre parole, provare a sostituire il vostro file:///android_asset/Samples/" + imageName
con appena imageName
.
Controlla l'API Demos, in particolare la classe ReadAsset.java:
try {
InputStream is = getAssets().open("read_asset.txt");
...
in cui le attività delle cartelle assomiglia
Altri suggerimenti
Frank Ho avuto lo stesso problema!
Ho avuto le mie immagini PNG all'interno di "attività" del mio progetto e AssetManager.open () tenuti a darmi un'eccezione, perché non riusciva a trovare il file!
I investigato utilizzando assetManager.list ( "") alla lista che cosa è in "attività". In seguito ho scoperto che le mie immagini sono state in realtà NON aggiunti alle "attività"!
Come potete immaginare mi è stato sempre abbastanza incazzato a questo punto perché, ovviamente, le mie immagini delle cartelle di dovrebbe sono stati tra le attività perché ho potuto vederli giocare come il giorno in Eclipse all'interno delle "attività" maledetti il mio progetto.
Soluzione
- back-up dei file che si trovano in attività cartella del vostro progetto. Ho usato di Windows Explorer per questa operazione di trascinamento della selezione.
- tornare ad eclissare ed eliminare i file all'interno di "attività". Utilizzare Eclipse per questo in modo che non è necessario per aggiornare il vostro progetto.
- ottenere la vostra finestra posteriore di Windows Explorer e trascinare i file di backup in Eclipse e sul "attività". Il cursore si trasforma in una "+". Quando si lascia andare del pulsante del mouse Eclipse vi verrà chiesto se si desidera collegare o copiare. Selezionare la copia.
- ricostruire il progetto e le immagini sono ora veramente in attività.
Bonus - metodo che ho aggiornato il getBitmapFromAsset ():
private Bitmap getBitmapFromAsset(String strName) throws IOException
{
AssetManager assetManager = getAssets();
InputStream istr = assetManager.open(strName);
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}