2012-09-24 6 views
13

奇妙なUIの問題。イメージは時には黒(正確な境界)または不適切なイメージソース(正しい境界で)で読み込まれます。これはImageViewsに影響し、色資源への参照を伴ってandroid:backgroundタグを実行しました。欠落または誤ったイメージや背景

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

次のスクリーンショットでは、この動作を見ることができます:

  • これは、(実際には間違って私のImageViewのに引き込まれている6かそこらピクセル幅の列区切りの画像であるImageViewのが正しいサイズているようです自体)。

    Torn

  • ではなくそうのように登場(と残った)アプリケーションの出入り、その後、再び(繰り返し)で:

    Black

  • を強制解除し、後アプリデータを消去して正しい形式に戻しました:

    This is the original:

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

これらのイメージのレイアウトは何も特別なものではありません。私はレンダリングのライフサイクルで面白いことはしません(私はonDraw()またはonMeasure()などを上書きしていません)。これらの画像のソースは動的に設定されず、XMLを介して設定されます。

上記の例からわかるように、インストール間ではなくアプリライフサイクル間に発生するので、ビルドの問題ではありません。それはまた別のデバイスで起こっている、サムスン8.9、エイサーIconiaタブ、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 Ticketを逆さまにしたもの」)または空白のボックス(以下に示す)のいずれかがロードされることがあります。なぜ誰が知っていますか?ここで

enter image description here

が、それは非常に簡単です、あなたが見ることができるように、スプラッシュページのレイアウトで、何の驚き:

<?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> 

理論がテストとdebunct:

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

image = (ImageView) findViewById(R.id.image); 
    image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      image.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      moveToStartScreen.start(); 
     } 
    }); 

上記のコードは、画像が確実に開始ページに移動する前に確実に読み込まれていることを確認していましたが、観察可能な効果がなかったようです。

これは、いくつかは、どのようにプログラムの実行にcurruptedさR.id/R.colour/R.drawableリソースによって引き起こされていることができれば、私も思っていたもう一つの理論

?なぜが起こるかもしれないと誰も知っていますか?

Androidが正しく割り当てていないメモリアドレスで自分のネイティブコードが実行されている可能性がありますか?

これまでに気付いたことがありますか?

+0

私が使っていたライブラリプロジェクトに現れて、間違ったドローアブルの問題を持っていた、とあなたは同じことを報告して以来、私はそれをGoogleで検索してhttp://stackoverflow.com/questions/7724145/android-drawableになってしまいました-resource-id-conflict。どんな助け? – aamit915

+0

あなたのネイティブコードがあなたのアプリケーションとどのようにインターフェースするかをもう少し説明できますか?ネイティブコードが何かを書くことは、私にとってもっともらしいようです。 –

+0

@MattGibson UIコンポーネントが受信するために登録できるコールバック/リスナメソッドを起動するJNIメソッドを介したネイティブコードインターフェイス。ネイティブコードをOpenGLコンテキストに直接書き込むことを考慮しない限り、JNIの外部に直接データを送信することはありません。 – Graeme

答えて

2

Graeme、私はほぼ同じ問題を抱えていて、それがアンドロイドplattformの報告されたbugであることを知った。それは私が思う3.0バージョンで修正されました。どのAPIをコンパイルしていますか?最後に利用できるAPIを構築し、あなたの問題は、このバグに関連している場合は、この問題を修正する必要がありJDK 1.6

でコンパイルしてくださいにしてください。

+0

私は簡単にこれはリソースIDの衝突であることを想像することができますが、それは確かに、バグレポートの1(失われた画像はアプリ全体であるため、「最初」の画像はありませんとは異なる提示し、私はいつもそれを疑われてきましたOSのバグ。 – Graeme

+1

私はこのバグは、OSのハニカム+のバージョンに存在しないことを確認することができますので、私はそれが出現は、より多くのデバイスがアップグレードしたり、時代遅れになるとあまり成長するのです願っています。 – Graeme

0

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

私は、.javaファイルの依存関係はシステム全体に伝播しますが、画像や.xmlファイルなどのリソースでは必ずしもそうとは限りません。

解決策は非常に簡単で、すべてをクリーンにし、すべてのプロジェクトを更新して再構築します。引き伸ばした端や黒い端をなくしてください。

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

+0

(ましたアンドロイドSDKのツールチェーンによって構築されます)、APKにすべてのビジュアルをねじ込むことに含まれています。良いことは、それがメイヴァンであったということでした。問題を見つけるために印刷されたエラーがありました。 Eclipseビルドでログを表示できるかどうかはわかりませんが、可能であれば、1つのリソースがすべてオフになっていると不満を感じるかもしれません。 –

+0

あなたの答えをありがとう。私はこの問題を数十ヶ月にわたり10ヶ月以上にわたり続けていますが、リリースのビルドやデバッグには何百ものものがあります。 – Graeme

+0

また、関連する画像は9パッチではなく、一部は画像でもない(カラーリソースへのリンク)。また、アプリケーション上のデータをクリアしてからもう一度起動すると、ビルドの問題にはならないという問題が解決されます。 – Graeme

関連する問題