0

ArrayAdapter からデータを取得するスピナーがあります。配列オブジェクトには toString() メソッドがあり、これはスピナーによって使用されます。

この場合、配列に項目が 1 つしかないときにアダプターを設定しています。配列内のオブジェクトは null ではない文字列を返しますが、スピナーには項目が 1 つありますが、それは null です。スピナーのアイテムとして有効な TextView がないのはなぜですか。アダプターが設定された直後にブレークポイントが設定されたプログラムを次に示します。

ブレークポイント

問題は次のとおりです。

式

これがMolDataクラスです

final class MolData
{
    private String name;
    private String value;
    final static Pattern endsDot = Pattern.compile("[.]$");

    MolData(String name, String value)
    {
        this.name = name;
        this.value = value;
    }
    MolData(String fileLine)
    {
        int dividerPos = fileLine.indexOf(':');
        value = fileLine.substring(0, dividerPos);
        name = fileLine.substring(dividerPos + 1);
    }

    @Override
    public String toString()
    {
        return name;
    }

    String getValue()
    {
        return value;
    }

    void setValue(String value)
    {
        this.value = value;
    }

    boolean hasName(String name)
    {
        return name.equals(this.name);
    }

    @SuppressLint("DefaultLocale")
    boolean isAfterName(String name)
    {
        if (this.value.equals(""))
        {
            return true;
        }
        int cmp = name.toLowerCase().compareTo(this.name.toLowerCase());
        if (cmp == 0)
        {
            cmp = name.compareTo(this.name);
        }
        return cmp > 0;
    }

    boolean hasValue(String value)
    {
        return this.value.equals(endsDot.matcher(value).replaceFirst(""));
    }
}

Abd は、問題のあるコードです。

void finaliseSpinner(Spinner memSpinner, View molValue)
{
    this.memSpinner = memSpinner;
    this.molValue = (TextView) molValue;
    if (! restart)
    {
        memSpinner.setVisibility((molData.isEmpty() || (molData.size() == 1 && molData.get(0).hasValue(""))) ? View.INVISIBLE : View.VISIBLE);
        spinerColour1st = true;
    }
    memSpinner.setAdapter(spinnerAdapter =
            new ArrayAdapter<MolData>(activity, android.R.layout.simple_spinner_dropdown_item, molData));
    ignoreItemSelected = true;
    memSpinner.setOnItemSelectedListener(new SpinListener());
}

さらなる明確化: 私が遭遇した問題は、getChildAt(0) が OnItemSelected リスナーで null を返すことでした。ただし、このコードが通常の起動で呼び出されると、アダプターが設定された後に getChildCount がゼロを示しますが、直後にリスナーが設定されると、その追加によるリスナーの呼び出しは有効な getChildAt(0) を持ちます! ただし、画面が回転されたためにこのコードが呼び出されると、追加されているため、リスナーが起動すると getChildAt(0) は null になります。通常の起動時には、このコードは UI とのユーザー インタラクションから呼び出されますが、画面が再起動された後、このコード (フラグメント内) は onResume() から呼び出されます。[onCreateから呼び出されましたが、ライフサイクルの後半に移動して、それが役立つかどうかを確認しましたが、成功しませんでした。]

4

0 に答える 0