私は、ここの誰かがこの種の行動の原因を知っていることを望んでいました:
私のアプリケーション全体で、一見ランダムな場所とランダムな条件で、この奇妙な 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 が正しく割り当てていない一部のメモリ アドレスでネイティブ コードが暴走している可能性はありますか?
誰かが以前にこれに気づいたことがありますか?または、おそらくこの動作が発生する理由を知っていますか?