0

Stackで2つの例を見ましたが、機能させることができません。アセット内のフォルダーから画像を取得してImageViewのように設定しようとしていますが、nullポインターが返されます。私は何が間違っているのですか?

主な活動:パッケージ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;

        }

    }

}

エクステンダークラス:

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;

    }

}

そして私の2つの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

レイアウト>

<?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"/>

編集:

これも試しましたが、ファイルが見つからないという例外が発生します。

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;

    }
4

2 に答える 2

2

どこ"file:///android_asset/Samples/" + imageNameから来たの?階層がassets/file_name.jpgのようになっている場合は、を呼び出すだけopen(file_name.jpg)です。file:///android_asset/Samples/" + imageNameつまり、をだけに置き換えてみてくださいimageName

APIデモ、特にReadAsset.javaクラスを確認してください。

try {
        InputStream is = getAssets().open("read_asset.txt");

..。

アセットフォルダは次のようになります

代替テキスト

于 2010-10-28T04:29:54.783 に答える
2

フランク私も同じ問題を抱えていました!

プロジェクトの「アセット」内にPNG画像があり、AssetManager.open()でファイルが見つからなかったため、例外が発生し続けました。

私はassetManager.list( "")を使用して、「assets」の内容を一覧表示して調査しました。その後、自分の画像が実際には「アセット」に追加されていないことを発見しました。

ご想像のとおり、この時点で私はかなり腹を立てていました。これは、プロジェクトのくそった「アセット」フォルダー内のEclipseで画像が日中再生されるのを見ることができたため、明らかに私の画像がアセット内にあるはずだったためです。

解決

  1. プロジェクトのアセットフォルダにあるファイルをバックアップします。このドラッグアンドドロップ操作にはWindowsエクスプローラーを使用しました。
  2. Eclipseに戻り、「アセット」内のファイルを削除します。これにはEclipseを使用して、プロジェクトを更新する必要がないようにします。
  3. Windowsエクスプローラーウィンドウを元に戻し、バックアップしたファイルをEclipseと「アセット」にドラッグします。カーソルが「+」に変わります。マウスボタンを離すと、リンクまたはコピーするかどうかを確認するメッセージが表示されます。コピーを選択します。
  4. プロジェクトを再構築すると、画像は本当にアセットになります。

ボーナス-getBitmapFromAsset()メソッドを更新しました:

private Bitmap getBitmapFromAsset(String strName) throws IOException
{
    AssetManager assetManager = getAssets();

    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);

    return bitmap;
}
于 2011-05-05T19:03:15.867 に答える