1

解決済みであり、明確にするために内容が編集されています。

関連資料:

Android ADT バージョン 22、R.java ファイルが生成されない

Eclipse での Android 向け開発: R.java が再生成されない

実行時に NinePatch/NinePatchDrawable を作成する

https://code.google.com/p/android-apktool/wiki/9PatchImages

質問: 9 パッチの R.java への参照をプログラムで (XML 定義ではなく実行時に) 取得して、EmployeeAdapter::getView().

答え:

  • すべてのビュー オブジェクト に対して9 つのパッチ バックグラウンドを同じようランタイム/プログラムで設定するには、オブジェクトを返す前に の内部で実行します。view.setBackgroundResource(R.drawable.blue_fill)Adapter::getView(...)
  • 9 つのパッチ バックグラウンドをそれぞれのビュー オブジェクトに対して個別にランタイム/プログラムで設定するは、の内部実行します。setBackgroundResource(R.drawable.blue_fill)View::onDraw(...)
  • の実装が9.png のView::onDraw(Canvas c) 上に描画c.drawColor(color)されないように注意してください。
  • ファイル (blue_fill.9.png) を正しい /res/drawable-*/フォルダーに配置します (安全のために!)。
  • 9 つのパッチ ファイルはすべて小文字にする必要があると読みました。(安心してやってください!)
  • XML ファイル内に 9 つのパッチを定義する構文があります(これをどのように利用するか正確にはわからず、この範囲を超えています) が、私はそれを必要としなかったことを保証できます。実際、ワークスペースを作成してからXML 構文で/res/drawable-mdpi/blue_fill.xmlリンクした後、ワークスペースの問題が発生したのではないかと強く疑っています。/res/drawable-mdpi/blue_fill.9.pngこれはおそらく間違っています!
  • 以下の作業コードを自由に借りてください。
  • /res/、/layout/ でエラーが発生すると、あらゆる種類の問題が発生し、ワークスペースがホース化される可能性があるため 、XML またはその他の非 .java ファイルを編集する場合 は注意してください。(1)常に LogCat、問題、コンソール出力を確認し、(2) Eclipse のエラー ログを調べ、最後に (3)ビルド構成を徹底的に調べて、問題が解決しないかどうかを確認します (ADT v22 の新しい "Project>Properties> を再確認します)。 Java Build Path> Order and Export 」を選択し、ソースコードが既存のライブラリを Order より上位に隠していないことを確認してください!

私の問題への答え:

ADT 22 とは完全に独立した理由により、私のワークスペースは再生成されなくなりましR.javaた。/res/drawable-*/フォルダーをいじった ことが問題の原因だったのではないかと思います。ワークスペースを未使用の状態に戻そうとする以外ic_launcher.pngのすべてのファイルを削除しました。/res/drawable-*/また、間違った R ライブラリをインポートしたのではないかと思います (インポートする必要があるのは だけですimport com.example.yourproject.R) 。

元の問題: bl_fill.9.pngXML で定義された を使用できますGridViewbl_fill.9.pngただし、プログラムで同じものをViewオブジェクトに割り当てようとするとEmployeeAdapter::getView(...)、コンパイル時にエラーが発生しbl_fill cannot be resolved or is not a fieldます.

これを修正するために何日も費やしました。どんな助けでも大歓迎です!

環境:

  • ADT : v22
  • Android SDK ツール: rev22
  • Android SDK プラットフォーム ツール: rev17
  • Android SDK ビルドツール: rev17
  • 対象API:Android 4.1 Jelly Bean(APIレベル16)
  • 最高の API : Android 4.2 Jelly Bean (API レベル 17)

試み:

  • /res/drawable-*/ フォルダーが間違っていますか?

すべての写真を 1 つのフォルダーにまとめてみました。すべてのフォルダのすべての写真を試しました。GridView画像リソースが見つからないことについて問題が発生することは決してないため、画像はどこにいても問題なく供給されているようです。

  • ナインパッチが悪い?

不適切にフォーマットされた *.9.png である可能性があることを暴くために、それらのいくつか (すべてダウンロードしたもの) を試しましたが、すべてが XML 定義の GridView で動作します。

  • 成功コード:

/res/layout/ activity_main.xml : GridView はここで XML で定義されており、9 パッチの割り当てに成功していますbl_fill

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"

    android:numColumns="5"
    android:columnWidth="90dp"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"

    android:background="@drawable/bl_fill"
/>

/res/drawable-xxhdpi/ xxhdpi-9p.xml : このファイルは、コンパイラが「ソース」9 パッチ (制御ピクセルの境界線 1px を含む) を「コンパイル済み」9 パッチ (追加) に変換するために必要であることを理解しています。 「チャンク」メタデータを削除し、すべてのコントロール ピクセルを削除します)。しかし、もっと重要なことは、このファイル定義から生成する必要があることを理解していますint R.java.drawable.bl_fill

<?xml version="1.0" encoding="utf-8"?>
<nine-patch 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/bl_fill"/>
  • 失敗したコード (更新され、動作するようになりました):

ただし、は他のリソースの参照をR.java生成しているように見えますintが、頑固に の参照を生成しませんbl_fill

EmployeeAdapter.java

package com.stackoverflow.signinboard;

import java.util.List;

import android.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;

// useful "Good Practices" for Adapters referenced at
// http://www.piwai.info/android-adapter-good-practices/
//
// also
// http://androidadapternotifiydatasetchanged.blogspot.in/
/**
 * An adapter that abstracts the structure of a database and safely exposes
 * information to consumers.
 * 
 * {@link GridView} uses this to obtain self-draw information for itself and
 * {@link EmployeeView} children
 */
public class EmployeeAdapter extends BaseAdapter {
    private Context mContext;
    private List<Employee> mEmployees;

    public EmployeeAdapter(Context c, List<Employee> employees) {
        mContext = c;
        mEmployees = employees;
    }

    @Override
    /**
     * Returns the total number of employees
     */
    public int getCount() {
        return mEmployees.size();
    }

    /**
     * Returns the specified employee
     * 
     * @param arg0
     *            Index of the employee in database
     */
    @Override
    public Object getItem(int arg0) {
        return mEmployees.get(arg0);
    }

    /**
     * Not implemented.
     */
    @Override
    public long getItemId(int arg0) {
        return 0;
    }

    /**
     * Gets the EmployeeView specified by 'index'.
     * 
     * @param index
     *            Index of this employee in the database
     * @param convertView
     *            Reference to a View that may or may not be initialized
     * @param parent
     *            Viewgroup that this View is associated with
     * @return An initialized EmployeeView at the specified index
     */
@Override
public View getView(int index, View convertView, ViewGroup parent) {
    EmployeeView employeeView;

    // Recylce reference if possible, else instantiate a new EmployeeView
    if (convertView == null) {

        // Instantiate an Employeeview with the ID and state
        // and define its parameters
        employeeView = new EmployeeView(mContext, mEmployees.get(index)
                .getmEmployeeId(), mEmployees.get(index).getState());

        employeeView.setLayoutParams(new GridView.LayoutParams(150, 85));
        employeeView.setPadding(8, 8, 8, 8);

        employeeView.setBackgroundResource(R.drawable.bl_fill);
    } else {
        // Set new values for the ID and state of this EmployeeView
        employeeView = (EmployeeView) convertView;
        employeeView.initEmployee(mEmployees.get(index).getmEmployeeId(),
                mEmployees.get(index).getState());
    }

    return employeeView;
}
}
4

0 に答える 0