解決済みであり、明確にするために内容が編集されています。
関連資料:
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.png
XML で定義された を使用できますGridView
。bl_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;
}
}