0

ViewPager を使用するアプリケーションがあります。ViewPager 内では Fragments を使用せず、ビューを膨張させただけです (一部のコンテンツを含む RelativeLayout)。これらのビューは事前に作成され、リストに保持されます。メソッド getCount、isViewFromObject、instantiateItem、および destroyItem をオーバーライドする単純な PagerAdapter 実装を作成しました。

Android 2.x デバイスで実行すると、すべて正常に実行され、メソッド instantiateItem は、オフスクリーン ページとして読み込まれるページごとに 1 回だけ呼び出されます。

しかし、ICS で実行すると、instantiateItem メソッドがループで呼び出され、アプリケーション全体が応答を停止します。私が認識できたのは、instantiateItem メソッドが測定の結果として呼び出されるということだけでした。しかし、ICSで測定がループで定期的に呼び出される理由と、それを停止するために何ができるかはわかりません。

以下にコード スニペットを示しますが、特別なことは何もないと思います。

    mAdapter = new PagerAdapter()
    {
        @Override
        public boolean isViewFromObject(View arg0, Object arg1)
        {
            return arg0 == arg1;
        }

        @Override
        public int getCount()
        {
            return mPages.size();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position)
        {
            View v = mPages.get(position);
            boolean isChild = false;
            for(int idx = 0; idx < getChildCount(); ++idx)
            {
                if(getChildAt(idx) == v)
                {
                    isChild = true;
                    break;
                }
            }
            if(!isChild)
                addView(v);
            return v;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object item)
        {
            removeView((View)item);
        }

    };
    setAdapter(mAdapter);

このコードは、ViewPager から派生するクラスの初期化メソッドに配置されます。

この問題は私を夢中にさせ、私のアプリケーションを ICS デバイスで使用できなくするので、ヒントをいただければ幸いです。

4

1 に答える 1

1

答えはアプリケーションのローカリゼーションに隠されています - Application.onConfigurationChange をオーバーライドし、新しいデフォルトの Locale を設定し、この新しい Locale で構成を更新します。

これは、アプリケーションのロケールを強制するための推奨されるアプローチですが、ICS では、横向きに切り替えると、ViewPager を含むアクティビティが定期的に再作成されました。

このような状況に遭遇した場合は、アプリケーションのメソッドではなく Activity.onConfigurationChange をオーバーライドすることをお勧めします。何らかの理由で、ICSで正常に動作します。

于 2012-04-23T13:36:15.837 に答える