1

私のAndroidプロジェクトでは非常に奇妙な動作をしています。

まず、ANumberPickerというカスタムビューを作成しました(OSバージョンが3.0未満のAndroidデバイスで使用するため)。クラスのコードスニペットは次のとおりです。

public class ANumberPicker extends LinearLayout {


    // ...


    @NotNull
    private final NumberPickerButton incrementButton;

    @NotNull
    private final NumberPickerButton decrementButton;

    public ANumberPicker(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        setOrientation(VERTICAL);

        // INFLATING LAYOUT
        final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.number_picker, this, true);

        final InputFilter inputFilter = new NumberPickerInputFilter();
        numberInputFilter = new NumberRangeKeyListener();

        incrementButton = (NumberPickerButton) this.findViewById(R.id.increment);
        incrementButton.setNumberPicker(this);

        decrementButton = (NumberPickerButton) this.findViewById(R.id.decrement);
        decrementButton.setNumberPicker(this);

        // ...
   }

   // ...

}

number_picker.xmlのレイアウトは次のとおりです。

<merge xmlns:a="http://schemas.android.com/apk/res/android">

<org.solovyev.android.view.NumberPickerButton
        a:id="@+id/increment"
        a:layout_width="fill_parent"
        a:layout_height="wrap_content"
        a:background="@drawable/timepicker_up_btn"/>

<EditText a:id="@+id/timepicker_input"
          a:layout_width="fill_parent"
          a:layout_height="wrap_content"
          a:gravity="center"
          a:singleLine="true"
          style="?android:attr/textAppearanceLargeInverse"
          a:textColor="@android:color/primary_text_light"
          a:textSize="30sp"
          a:inputType="numberDecimal"
          a:background="@drawable/timepicker_input"/>

<org.solovyev.android.view.NumberPickerButton
        a:id="@+id/decrement"
        a:layout_width="fill_parent"
        a:layout_height="wrap_content"
        a:background="@drawable/timepicker_down_btn"/>

ANumberPickerコンストラクターで、'number_picker.xml'レイアウトを拡張し、idでビューを取得しようとします。inflaterはattachToRoot='true'パラメーターで使用されます。しかし、この行の実行時にNullPointerExceptionが発生しました。

incrementButton.setNumberPicker(this);

つまり、incrementButton=nullです。

さらに、Jetbrains IDEAでこのコードをデバッグします。「ウォッチ」ウィンドウで次の値を取得しました(ブレークポイントはNPEを使用してソース行に設定されます)。

(NumberPickerButton) this.findViewById(R.id.increment) = {org.solovyev.android.view.NumberPickerButton@830082344688}
R.id.increment = 2131296256
this.getChildAt(0).getId() = 2131296256
incrementButton = null 

つまり、まったく同じコードがデバッガーでnullではないことを返します。そして、私はそれを理解することができません...何か提案はありますか?どこに問題があるのでしょうか?

PSプロジェクトをクリーンアップして再構築しました(Mavenを使用しています)

編集私は手がかりを見つけました:R.id.incrementとviewは異なる整数識別子を持っています(私はちょうどLogcatにそれらのIDを記録しました)。しかし、問題は解決しません-プロジェクトをクリーンアップしても役に立ちません...

4

1 に答える 1

1

解決済み:Jetbrains IDEAは以前に作成されたRファイルをキャッシュに保存するため、「キャッシュを無効にする」で問題が修正されました。

于 2012-08-08T20:18:56.920 に答える