0

シリアル デバイスに接続するアプリがあります。アプリケーションを起動するときに設定を非表示にしたいので、linearlayout を非表示に設定し、削除しました。ただし、これは接続が確立されていないことを意味します。ビューが非表示に設定されている場合、スピナーに設定したデフォルト値が読み取れないという問題があります。これはなぜですか、どうすれば修正できますか。

設定が非表示のときに接続した場合、設定を開くと接続は正常に機能します。

したがって、両方のレイアウトが次のように表示されていれば問題なく動作します: http://i.imgur.com/N5cU0Wg.png

設定レイアウトが見えない場合は正常に動作します: http://i.imgur.com/hIttP24.png

しかし、それがなくなった場合、設定を引き出すまで機能しません: http://i.imgur.com/ViJUgf3.png

onCreate でデフォルト 9600 で作成したスピナーの例を次に示します。

mBaudSpinner = (Spinner) findViewById(R.id.bannerBaudSpinner);
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
                this, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mBaudSpinner.setAdapter(adapter);
        String[] tempArray = SlickUSB2Serial.BAUD_RATES;
        for (int i = 0; i < tempArray.length; i++) {
            adapter.add(tempArray[i]);
        }
        mBaudSpinner.setSelection(SlickUSB2Serial.BaudRate.BAUD_9600.ordinal());

編集:

接続が見つかったときに発生するコードを次に示しますが、ビューがなくなったときに呼び出されません。ここにライブラリ メソッドを実装しました。

@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position,
            long id) {
        //bannerView.setVisibility(View.INVISIBLE);
        //bannerView.setVisibility(View.GONE);


        // TODO Auto-generated method stub

        Log.d(TAG3, "in onItemSelected");
        changeSelectedAdapter(mDeviceAdapters.get(position));
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }

    public void changeSelectedAdapter(USB2SerialAdapter adapter) {
        Toast.makeText(this, "in changeselectedadapter", Toast.LENGTH_SHORT)
                .show();
        // if(mSelectedAdapter!=null){
        // mDeviceOutputs.set(mDeviceSpinnerAdapter.getPosition(mSelectedAdapter.getDeviceId()+""),mReceiveBox.getText().toString());
        Log.d(TAG3, "in change selected adapter");
        mSelectedAdapter = adapter;
        mBaudSpinner.setSelection(adapter.getBaudRate().ordinal());
        mDataSpinner.setSelection(adapter.getDataBit().ordinal());
        mParitySpinner.setSelection(adapter.getParityOption().ordinal());
        mStopSpinner.setSelection(adapter.getStopBit().ordinal());

        updateCurrentSettingsText();

        // mReceiveBox.setText(mDeviceOutputs.get(mDeviceSpinner.getSelectedItemPosition()));
        Toast.makeText(this,
                "Adapter switched toooo: " + adapter.getDeviceId() + "!",
                Toast.LENGTH_SHORT).show();
        String getInitialPrompt = "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n";
        try {
            sendOverSerial(getInitialPrompt.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d(TAG, "exception");
        }

    }

    @Override
    public void onAdapterConnected(USB2SerialAdapter adapter) {
        adapter.setDataListener(this);
        mDeviceAdapters.add(adapter);
        mDeviceOutputs.add("");
        mDeviceSpinnerAdapter.add("" + adapter.getDeviceId());
        mDeviceSpinner.setSelection(mDeviceSpinnerAdapter.getCount() - 1);

        Toast.makeText(this,
                "Adapter: " + adapter.getDeviceId() + " Connected!",
                Toast.LENGTH_SHORT).show();

    }

これは呼び出されます:

public void onAdapterConnected(USB2SerialAdapter adapter) {
        adapter.setDataListener(this);
        mDeviceAdapters.add(adapter);
        mDeviceOutputs.add("");
        mDeviceSpinnerAdapter.add("" + adapter.getDeviceId());
        mDeviceSpinner.setSelection(mDeviceSpinnerAdapter.getCount() - 1);

        Toast.makeText(this,
                "Adapter: " + adapter.getDeviceId() + " Connected!",
                Toast.LENGTH_SHORT).show();

    }

これを呼び出す必要がありますが、そうではありません:

public void onItemSelected(AdapterView<?> parent, View view, int position,
            long id) {
        //bannerView.setVisibility(View.INVISIBLE);
        //bannerView.setVisibility(View.GONE);


        // TODO Auto-generated method stub

        Log.d(TAG3, "in onItemSelected");
        changeSelectedAdapter(mDeviceAdapters.get(position));
    }

onItemListener への唯一の参照は onCreate にあるため、スピナーが「なくなった」ため処理されていませんか?

mDeviceSpinner = (Spinner) findViewById(R.id.bannerDeviceSpinner);
        mDeviceSpinnerAdapter = new ArrayAdapter<CharSequence>(this,
                android.R.layout.simple_spinner_item);
        mDeviceSpinnerAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mDeviceSpinner.setAdapter(mDeviceSpinnerAdapter);
        mDeviceSpinner.setOnItemSelectedListener(this);

ここにmSelectedadapterのドキュメントがあります、i.imgur.com/Ezigt7G.png

私のアプリでは次のように定義されています。

private static USB2SerialAdapter mSelectedAdapter;
4

1 に答える 1

0

問題は、アダプターが接続されていたにもかかわらず、onItemSelected が呼び出されていなかったため、changeSelectedAdapter が呼び出されなかったことです。これは、ビューが非表示に設定されている場合、アイテムを選択してはならないためですか?

これを修正するには、次の 2 つの方法があります。

接続が確立されたら、手動で呼び出します。

changeSelectedAdapter(mSelectedAdapter);

または、アダプターが接続されたら、いくつかのデフォルト値を設定できます。

mSelectedAdapter = adapter;
mSelectedAdapter.setCommSettings(BaudRate.BAUD_9600, DataBits.DATA_8_BIT, ParityOption.PARITY_NONE, StopBits.STOP_1_BIT);

3 番目の方法は、ビューを表示することですが、サイズをプログラムで小さなサイズに設定し、必要に応じて目的のサイズに戻すことができます。

于 2013-03-06T12:11:34.047 に答える