13

私は、ここの誰かがこの種の行動の原因を知っていることを望んでいました:

私のアプリケーション全体で、一見ランダムな場所とランダムな条件で、この奇妙な UI の問題を観察しています。画像が黒 (正しい境界) で読み込まれたり、不適切な画像ソース (再び正しい境界) で読み込まれたりすることがあります。これは、カラー リソースへの参照を含むタグに影響ImageViewsを与え、影響を与えてきました。android:background

私のアプリケーションは 6 つのライブラリ プロジェクトに依存しており、サービスを介してネイティブ コードを実行し、アプリのアクティビティは GlSurfaceViews を使用します (ただし、問題を表示するすべてのアクティビティに OpenGL コンポーネントが含まれているわけではありません)。問題は、これらの場所のいずれか、または大量のメモリを使用することによるそれらの組み合わせにあると思われます。

この動作は、次のスクリーン ショットで確認できます。

  • これは実際には、ImageView に誤って描画された 6 ピクセル程度の幅の列区切り画像です (ImageView 自体のサイズが正しく設定されているようです)。

    引き裂かれた

  • アプリケーションから出てから再び(繰り返し)戻ると、代わりに次のように表示されました(そして残りました):

    黒

  • Force Clear と Clear App Data の後、正しい形式に戻りました。

    これはオリジナルです:

また、横にある拡大鏡の画像も見られるように、これらのそれぞれに問題なく表示されています。これらの画像や背景が見つからない/正しくないという問題は、アプリケーションのライフサイクル全体でランダムに発生するようで、再現する方法を見つけることができませんでした。

これらの画像のレイアウトは特別なものではありません。レンダリングのライフサイクル中に面白いことは何もしていません (オーバーライドonDraw()などはしていませんonMeasure())。これらの画像のソースは動的に設定されるのではなく、XML 経由で設定されます。

上記の例からわかるように、インストール間ではなくアプリのライフサイクル間で発生するため、ビルドの問題ではありません。Samsung 8.9、Acer Iconia Tab、Motarola XOOM、

参照テーブルに何らかのエラーがあるように思えますが、ネイティブ コードによって微調整された可能性がありますか? それとも、アプリケーションのいくつかの段階でメモリを使いすぎたことが影響しているのでしょうか?

上記の例の XML ソースは次のとおりです。

<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/browseProgressWrapper"
                android:layout_width="match_parent"
                android:layout_height="@dimen/actionbar_compat_height"
                android:orientation="horizontal">
    <RelativeLayout android:layout_width="@dimen/search_bar_width"
                    android:layout_height="match_parent">       
        <EditText       android:id="@+id/browseFilter"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginTop="4dp"
                        android:layout_marginLeft="5dp"         
                        android:imeOptions="actionSearch"
                        android:background="@drawable/edit_text_blue"
                        android:maxLength="30"/>
        <ImageView      android:id="@+id/clearSearch"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:src="@drawable/ic_input_delete"
                        android:layout_marginRight="5dp"/>
    </RelativeLayout>                   
    <ImageView      android:id="@+id/browseFilterButton"
                    android:src="@drawable/ic_menu_search"
                    android:scaleType="center"
                    android:layout_width="@dimen/actionbar_compat_height"
                    android:layout_height="@dimen/actionbar_compat_height"
                    android:layout_gravity="center_vertical"
                    android:minWidth="@dimen/actionbar_compat_height"/>         
</LinearLayout>

たまたまスクリーンショットを取得した別のそのような出来事を取り巻くコード/レイアウトのより完全な説明:

Activity新しい設定の詳細を保存した後にアプリを再起動する「設定」があります。を停止し、新しい(スプラッシュ アクティビティ) をService呼び出して終了することでこれを行います。Activity

   mConfiguration.save();
   mConfiguration = new Configuration(Configuration.getInstance());
   getActivity().stopService(new Intent(getActivity(), NativeService.class));
   getActivity().finish();
   startActivity(new Intent(getActivity(), SplashActivity.class));

ほとんどの場合 (およびほとんどのデバイスで)、これは正常に機能し、スプラッシュ アクティビティには正しく読み込まれる画像が含まれています。ただし、一部のデバイスでは、スプラッシュ アクティビティが正しくないリソース (私のテスターが「逆さまの Nike ティック」と呼んでいるもの) または空白のボックス (以下に示すように) をロードすることがあります。誰かが理由を知っていますか?

ここに画像の説明を入力

スプラッシュ ページのレイアウトは次のとおりです。非常にシンプルで驚くことはありません。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/ContentBackgroundColor"
    android:orientation="vertical" >

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="2" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/manager_android_400" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="2" />

</LinearLayout>

理論が検証され、証明された:

これは、スプラッシュ画面が終了して次のアクティビティに移動する前にレイアウトが完全に描画されていないプロセッサ/メモリの問題である可能性があると理論付けたので、次のコードを挿入しました。

    image = (ImageView) findViewById(R.id.image);
    image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        
        @Override
        public void onGlobalLayout() {
            image.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            moveToStartScreen.start();
        }
    });

上記のコードにより、開始ページに移動する前に画像が確実に読み込まれることが期待されますが、目に見える効果はないようです。

別の理論

また、これが R.id / R.colour / R.drawable リソースによって引き起こされている可能性があるかどうかも疑問に思っていました。なぜそれが起こるのか誰にも分かりません。

Android が正しく割り当てていない一部のメモリ アドレスでネイティブ コードが暴走している可能性はありますか?

誰かが以前にこれに気づいたことがありますか?または、おそらくこの動作が発生する理由を知っていますか?

4

2 に答える 2

0

これは、リフレッシュ、クリーン、および再構築の単純な問題です。さまざまなドローアブル フォルダーまたはリソース ID インデックス内の画像は、Eclipse IDE の外部で (GIT、SVN、またはその他の編集などの外部ソース管理を介して) 変更され、Eclipse ナビゲーターで更新されていないため、順序が正しくありません。または、UI アクティビティが依存するライブラリ プロジェクトでファイルが更新されている可能性があります。

.java ファイルの依存関係はシステム全体に伝播されますが、これは画像や .xml ファイルなどのリソースには常に当てはまるとは限りません。

ソリューションは非常に単純で、すべてをクリーンアップし、すべてのプロジェクトを更新して再構築します。引き伸ばされた、または黒いエッジがなくなるはずです。

注: この問題は、9 パッチ画像が標準の .png 画像のように扱われるようになったときに顕著に現れます。これは、エッジだけでなく、画像全体に直線的に引き伸ばされることを意味します。私にとって、これはあなたの「引き裂かれた/伸びた」例を説明しています。似たようなものをよく見かけます。もう 1 つのよくある症状として、テキスト文字列が間違ったリソースで表示されることがあります。

于 2012-10-03T01:27:54.963 に答える