16

私は初心者のアンドロイドプログラマーです。

文脈を説明しましょう。
私のプロジェクトでは ActionBarSherlock を使用しています。

  1. SherlockListFragment と、Google マップ MapView (本質的には MapFragment) を含む SherlockFragment の 2 つのフラグメントを含むアクティビティ (Activity1) があります。
  2. 検索結果はリスト フラグメントとマップ フラグメントに表示され、アクション バーのオプション ボタンは、現在表示されているフラグメントをリストとマップの間で切り替えます。
  3. リストまたは検索結果のマップで項目を選択すると、選択した項目のデータを表示する新しいアクティビティ (Activity2) が開始されます。
  4. この新しいアクティビティには、同様のフローがあります。データを表示するフラグメントと、場所を表示するマップ フラグメントです。アクション バーのオプション ボタンで切り替えます。

問題:

  1. 検索結果 (Activity1) のリスト フラグメントでリスト アイテムを選択でき、詳細ページ (Activity2) が正常に開始されます。
  2. (Activity1) のマップ オーバーレイからマップ アイテムを選択すると、アプリがクラッシュし、以下に示すスタック トレースが表示されます。

私がこれまでに試したこと:

  1. 「マップのサイズがゼロ」と、「android」と「illegalstateexception」を含む同じ検索の多くの順列、およびスタックトレースのさまざまな行を検索しました。また、android には関係なく、に関連する結果を調べました。 google maps apis は一般的で、この URL http://www.androidpub.com/1551654を除いて、このエラーに遭遇した人をどこにも見つけることができませんでした。あまり役に立ちませんでした。
  2. 何が起こっているのかを確認するために、ソース コードのスニペットをいくつか見つけようとしましたが、何も見つかりませんでした。
  3. コードにログを追加して、例外が発生した場所を特定しましたが、(Activity2) 詳細アクティビティが開始された後、つまり onCreate() が呼び出された後に発生することがわかりました。 . 詳細フラグメントとマップ フラグメントの両方が、onCreate() 内で正常にインスタンス化されています。コード内で例外をキャッチする場所さえ見つけられませんでした。したがって、私が見る限り、この例外は完全に google の MapView コードのバグのようですが、どこかで間違いを犯した場合は、それを示してください。ここで何が起こっているのかを教えてくれる人なら誰でも助けてくれます。

ということで、まとめ。現在マップビューを表示しているアクティビティ (Activity1) から、別のマップビューを含むフラグメントもホストしている別のアクティビティ (Activity2) に移動すると、クラッシュが発生します。ただし、(Activity1) に表示されているリスト フラグメントから別のマップ フラグメントを含む他のアクティビティ (Activity2) に移動する場合、クラッシュは発生しません。

これが十分な詳細であることを願っています。ご不明な点がございましたら、コメントください。

D/memalloc(  121): /dev/pmem: Allocated buffer base:0x4215c000 size:2088960 offset:4177920 fd:66
D/memalloc(30944): /dev/pmem: Mapped buffer base:0x5b4f5000 size:6266880 offset:4177920 fd:164
D/AndroidRuntime(30944): Shutting down VM
W/dalvikvm(30944): threadid=1: thread exiting with uncaught exception (group=0x40aaa228)
E/AndroidRuntime(30944): FATAL EXCEPTION: main
E/AndroidRuntime(30944): java.lang.IllegalStateException: Map has zero size
E/AndroidRuntime(30944):    at android_maps_conflict_avoidance.com.google.googlenav.map.Map.drawMap(Map.java:818)
E/AndroidRuntime(30944):    at com.google.android.maps.MapView.drawMap(MapView.java:1091)
E/AndroidRuntime(30944):    at com.google.android.maps.MapView.onDraw(MapView.java:522)
E/AndroidRuntime(30944):    at android.view.View.draw(View.java:11071)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10462)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:879)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.draw(ViewRootImpl.java:1948)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1654)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
E/AndroidRuntime(30944):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(30944):    at android.os.Looper.loop(Looper.java:154)
E/AndroidRuntime(30944):    at android.app.ActivityThread.main(ActivityThread.java:4894)
E/AndroidRuntime(30944):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(30944):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(30944):    at dalvik.system.NativeStart.main(Native Method)
E/EmbeddedLogger(  254): App crashed! Process: com.myapp.android
E/EmbeddedLogger(  254): App crashed! Package: com.myapp.android v5 (2.0)
E/EmbeddedLogger(  254): Application Label: myapp
W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.InfoActivity
W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.SearchActivity
4

2 に答える 2

0

私はアダムの意見には絶対に反対です!フラグメントとアクティビティを管理することは、これまでのベスト プラクティスです。

それはまったく異なり、何かを解決するのがさらに難しい場合もありますが、複数のビューにマップを含める予定がある場合は、マップ フラグメントをフラグメント自体として、または複数のアクティビティで使用される別のフラグメント内で管理することが最善の方法です。あなたのアプリの。

つまり、コードを投稿していないので、カメラをアニメーション化して境界をリセットするか、マップの最初の中心を設定しているだけだと思います。(結果を表示しているので、おそらく最初のもの)

その場合、例外はmap.animateCamera(...)ラインにあります。これは、利用可能なものを扱っているが、まだ膨らんでいないためです。

これを試してください:

try{
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,yourPadding);
        map.animateCamera(cu);
        System.out.println("Set with padding");
    } catch(IllegalStateException e) {
        e.printStackTrace();
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,someWidth,someHeight,zeroPadding);
        map.animateCamera(cu);
        System.out.println("Set with whp");
    }
于 2013-07-24T04:33:53.183 に答える
0

私の経験では、このバグを回避する唯一の方法は、フラグメント内で MapView を使用しないことです。親ビューに追加された後、アニメーションまたはその位置の改ざんによって MapView を移動すると、常に問題が発生します。私が見つけた最も効果的な方法は、MapActivity が MapView を管理し、フラグメントが他のビューを管理するマップと別のビューを切り替えることです。同じ機能を再度実装しましたが、問題なく動作しました。ただし、これは原因不明の問題 (Android マップ API のバグである可能性が非常に高い) の回避策であることがわかります。

于 2013-01-24T15:46:42.053 に答える