3

私のアプリケーションでは、ViewPager 内にマップ ビューを実装しようとしています。アプリケーションには 4 つの異なるページがあります。MapView は 4 ページ目にあります。マップは正常にロードされましたが、スワイプして最初のページに戻ると、destroyItem() メソッドを使用して 4 番目のビューを破棄する必要があります。4 ページ目にスワイプすると、3 ページ目からクラッシュし、logcat にエラーが表示されます。

05-10 13:14:50.152: E/AndroidRuntime(620): java.lang.IllegalStateException: You are only allowed to have a single MapView in a MapActivity

MapActivity に単一のマップビューしかないことを認識しています。しかし、私はそれを解決することができません - 誰かが私を助けることができますか?

コードは以下のとおりです。

public Object instantiateItem(View collection, int position) {

   LayoutInflater inflater = (LayoutInflater) collection.getContext()
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   context = collection.getContext();
   int resId = 0;
   int flag = resId;
   switch (position) {
   case 0:
      resId = R.layout.farleft; // first
      view = inflater.inflate(resId, null);

      break;
   case 1:
      resId = R.layout.left; // second
      view = inflater.inflate(resId, null);

      break;
   case 2:
      resId = R.layout.right; // third
      view = inflater.inflate(resId, null);

      break;
   case 3:
      resId = R.layout.mylocator;
      view = inflater.inflate(resId, null);
      break;

   }
   ((ViewPager) collection).addView(view, 0);

   return view;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {

   ((ViewPager) arg0).removeView((View) arg2);
   Log.d("destroyItem", "" + arg2);
}
4

2 に答える 2

1

私は解決策を見つけました。Map を含み、ViewPager によって使用されるフラグメント内に、次のように配置します。

private View myView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (this.myView == null){
        this.myView = inflater.inflate(R.layout.my_layout, container, false);
    }
    else if (this.myView.getParent() != null) {
        FrameLayout parentView = (FrameLayout) this.myView.getParent();
        parentView.removeView(this.myView);
    }

    return this.myView;

}

それは私にとってはうまくいきます、それがあなたにとってうまくいくかどうか教えてください;)

于 2012-08-22T09:07:42.527 に答える
0

Android View Pager の問題の 1 つは、ビューのリサイクルを手動で行う必要があることです。あなたの場合、ビューがまだ破棄されていない可能性がありますが、ビューが再度インスタンス化されたときに再度作成されます。各ページのビューを保存してから、まだ破棄されていない場合は instantiateItem に返すことができます。

于 2012-05-10T08:33:19.090 に答える