0

今まで、私は私のフラグメントの1つにこのコードを持っていました:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    this.myFragmentView = inflater.inflate(R.layout.foto_setmana, container, false); //Això conté els "edittext i altres"
    cont=getActivity(); //Recupero el contexte per poder pasar-lo.

    try {
        new DownloadImageTask((ImageView) myFragmentView.findViewById(R.id.imageView1)).execute("http://192.168.1.36/testing/fotos/foto1.jpg");
    } catch (Exception e){
        Log.d("errors", "Wohoops. Crashed");
    }

    return myFragmentView;
}

ただし、フラグメント間をスワイプするため、フラグメントに戻るたびにこの画像が常に読み込まれるため、コードをメインのFragmentActivityに移動することにしました。また、フラグメント内でこのようなコードを使用しないことをお勧めします。

私はこれを試しました:

public class AndroidViewPagerActivity extends FragmentActivity {
[...]
try {
        Log.d("debugging","a");
        new DownloadImageTask((ImageView) this.findViewById(R.id.imageView1)).execute("http://192.168.1.36/testing/fotos/foto1.jpg");
    } catch (Exception e){
        Log.d("errors", "Wohoops. Crashed");
    }
}

しかし、それはクラッシュしています。

ログがあります:

01-09 21:37:11.264: E/AndroidRuntime(976): FATAL EXCEPTION: main

01-09 21:37:11.264: E/AndroidRuntime(976): java.lang.NullPointerException
01-09 21:37:11.264: E/AndroidRuntime(976):  at com.exercise.AndroidViewPager.DownloadImageTask.onPostExecute(DownloadImageTask.java:34)
01-09 21:37:11.264: E/AndroidRuntime(976):  at com.exercise.AndroidViewPager.DownloadImageTask.onPostExecute(DownloadImageTask.java:1)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.os.AsyncTask.finish(AsyncTask.java:631)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.os.Looper.loop(Looper.java:137)
01-09 21:37:11.264: E/AndroidRuntime(976):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-09 21:37:11.264: E/AndroidRuntime(976):  at java.lang.reflect.Method.invokeNative(Native Method)
01-09 21:37:11.264: E/AndroidRuntime(976):  at java.lang.reflect.Method.invoke(Method.java:511)
01-09 21:37:11.264: E/AndroidRuntime(976):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-09 21:37:11.264: E/AndroidRuntime(976):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-09 21:37:11.264: E/AndroidRuntime(976):  at dalvik.system.NativeStart.main(Native Method)

ご覧のとおり、フラグメントから呼び出されたときに、以前使用していた(そして機能した)クラスでクラッシュしています。

これは、チェックしたい場合のクラスコードです。

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;

public DownloadImageTask(ImageView bmImage) {
    this.bmImage = bmImage;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    Log.d("debugging","b");
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {
    Log.d("debugging","c");
    bmImage.setImageBitmap(result);
}

}

logcatは、最後の行を正確に参照します。

bmImage.setImageBitmap(result);

任意のヒント?

ありがとう。

編集。このように私はフラグメントをナビゲートしています

public class AndroidViewPagerActivity extends FragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
ImageView imatgeSetmana;
Bitmap fotoSetmanaBitmap;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mViewPager = new ViewPager(this);
    mViewPager.setId(R.id.pager);
    setContentView(mViewPager);

    final ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME);
    bar.hide();

    mTabsAdapter = new TabsAdapter(this, mViewPager);
    mTabsAdapter.addTab(bar.newTab().setText("Foto setmana"), MyFragmentA.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Entries this week"), MyFragmentB.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Nothing yet"), MyFragmentC.class, null);

    try {
        //Descarrego la foto
        new DownloadImageTask(this.imatgeSetmana).execute("http://192.168.1.36/testing/fotos/foto1.jpg");
        //Guardo el bitmap de la foto 
        this.fotoSetmanaBitmap=((BitmapDrawable)imatgeSetmana.getDrawable()).getBitmap();


    } catch (Exception e){
        Log.d("errors", "Wohoops. Crashed");
    }

    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
}
4

1 に答える 1

0

コードをアクティビティに移動したときに、現在findViewById()表示されていないビューを見つけることができないことを忘れていました。アクティビティではなく、フラグメントで使用するレイアウトにあります。だから戻ります... アクティビティにビットマップへの参照を保存するだけで、フラグメントに表示するだけです(ImageViewが表示されている場合)。R.id.imageView1findViewById()null


さらに
fotoSetmanaBitmapプライベートではないため、次のように DownloadImageTask に保存できます。

protected void onPostExecute(Bitmap result) {
    Log.d("debugging","c");
    activity.fotoSetmanaBitmap = result; // Where activity is an instance of AndroidViewPagerActivity
}

次に、インテントを使用せずにロードします。

cont= (AndroidViewPagerActivity) getActivity(); //Recupero el contexte per poder pasar-lo.
if(cont.fotoSetmanaBitmap != null) {
    ImageView image = (ImageView) myFragmentView.findViewById(R.id.imageView1);
    image.setImageBitmap(cont.fotoSetmanaBitmap);
}
于 2013-01-09T21:53:04.843 に答える