web-dev-qa-db-ja.com

Android-タイプIDの期待されるリソース

私はこのコードを持っています

final static int TITLE_ID = 1;
final static int REVIEW_ID = 2;

次に、メインクラスに新しいレイアウトを作成します

public View createContent() {
    // create linear layout for the entire view
    LinearLayout layout = new LinearLayout(this);
    layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.setOrientation(LinearLayout.VERTICAL);

    // create TextView for the title
    TextView titleView = new TextView(this);
    titleView.setId(TITLE_ID);
    titleView.setTextColor(Color.GRAY);
    layout.addView(titleView);

    StarView sv = new StarView(this);
    sv.setId(REVIEW_ID);
    layout.addView(sv);

    return layout;
}

しかし、TITLE_IDとREVIEW_IDを呼び出すと、エラーが発生します

間違ったタイプのリソース識別子を指定しています。
たとえば、Resources.getString(int id)を呼び出すときは、R.drawable.somethingではなくR.string.somethingを渡す必要があります。
特定の定数セットの1つを予期するメソッドに間違った定数を渡します。たとえば、View#setLayoutDirectionを呼び出す場合、パラメーターはAndroid.view.View.LAYOUT_DIRECTION_LTRまたはAndroid.view.View.LAYOUT_DIRECTION_RTLである必要があります。

このコードを実行しても問題はありません。なぜエラーになるのか不思議に思っています。何か案が?

44
The Newbie

これはコンパイラエラーではありません。これは、Idを処理する一般的な方法ではないため、単なるエディター検証エラー(lint警告)です。

アプリがAPI 17以降をサポートしている場合、

View.generateViewId として呼び出すことができます

  titleView.setId(View.generateViewId());

そして

  sv.setId(View.generateViewId());

およびAPI <17

  1. プロジェクトのres/values/フォルダーを開きます
  2. ids.xmlというxmlファイルを作成します

次のコンテンツ:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="titleId" type="id" />
    <item name="svId" type="id" />
</resources>

次に、コードで、

  titleView.setId(R.id.titleId);

そして

  sv.setId(R.id.svId);

この警告を無効にするには(必要な場合)

Android Studioは、この「エラー」の行の電球をクリックします。最初のサブメニューで検査を無効にするを選択します。

99
Giru Bhai

Build.gradleファイルでlintを無効にすることもできます。これらの行をbuild.gradleファイルに追加します。

Android { 
       lintOptions{
             disable "ResourceType"
       }
}
24
Alvi

ビューIDを生成できない(つまり、ビューが実際に存在する前にIDを定義する)人々の問題を「修正」する代わりにこれを含め、彼らが何をしているかを知っています。

問題を含む変数宣言またはメソッドのすぐ上に、@SuppressWarnings("ISSUE_IDENTIFIER")を含めるだけで、そのインスタンスのlint警告を無効にします。

この場合、@SuppressWarnings("ResourceType")になります

一般的な方法を使用して警告タイプを無効にすると、悪い習慣になり、メモリリークや不安定なコードなどの予期しない問題が発生する可能性があります。ごみを公開しないでください。

Disable inspectionのオプションを元に戻し、build.gradleから次の行を削除してください。

Android {
    lintOptions{
        disable "ResourceType"
    }
}
6
Abandoned Cart