Editable text view with spinner android

2019-02-26 07:34发布

问题:

I want to create a control in android where user can input through keyboard or enter through drop down list(spinner).

Actually the values I hard code in array in spinner is not exhaustive, so user should have the option to input through virtual keyboard also.

So Either user can enter through keyboard or select from list?

How can i achieve this in android?

回答1:

You can build your own view:

public class ServerPreference extends DialogPreference {

    private String value;
    private EditText editText;
    private Spinner spinner;
    private final int server_list_id;
    ArrayList<String> servers;

    public ServerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setPersistent(false);

        setDialogLayoutResource(R.layout.server_preference_layout);

        servers = new ArrayList<String>();

        Resources r = context.getResources();   
        if (MySettings.KEY_ASR_SERVER_HOST.equals(getKey())) {
            server_list_id = R.array.asrServers;
        } else if (MySettings.KEY_LOG_SERVER_HOST.equals(getKey())) {
            server_list_id = R.array.logServers;
        } else {
            server_list_id = R.array.servicesServers;
        }
        Collections.addAll(servers, r.getStringArray(server_list_id));
    }

    @Override
    protected void onBindDialogView(View view) {
        editText = (EditText)view.findViewById(R.id.server_preference_text);
        spinner = (Spinner)view.findViewById(R.id.server_preference_spinner);

        SharedPreferences pref = getSharedPreferences();

        value = pref.getString(getKey(), "");
        editText.setText(value);

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                view.getContext(), server_list_id, android.R.layout.simple_spinner_item );
                adapter.setDropDownViewResource( android.R.layout.simple_dropdown_item_1line );

        spinner.setAdapter( adapter );

        updateSpinner();

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if ( position != 0 ) {
                    value = servers.get(position);
                    editText.setText(value);
                }
            }

            public void onNothingSelected(AdapterView<?> arg0) {
            }

        });     

        editText.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before, int count) {
                updateSpinner();
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            public void afterTextChanged(Editable s) {
            }
        });

        super.onBindDialogView(view);
    }

    void updateSpinner() {
        value = editText.getText().toString();
        int index = servers.indexOf(value);
        if ( index == -1 )
            index = 0;
        spinner.setSelection(index);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if ( positiveResult ) {
            SharedPreferences.Editor editor = getEditor();
            editor.putString(getKey(),value);
            editor.commit();
        }
        super.onDialogClosed(positiveResult);
    }

    public String getValue() {
        return value;
    }

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

}

Layout of custom view:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/server_preference_text" android:inputType="text">
        <requestFocus></requestFocus>
    </EditText>
    <Spinner android:layout_height="wrap_content" android:id="@+id/server_preference_spinner" android:layout_width="match_parent"></Spinner>

</LinearLayout>

When you want to use this view, just define in XML file:

<xxx.xxxxxx.xxxxx.settings.debug.ServerPreference
    android:title="ASR/VVS Server"
    android:persistent="true"
    android:positiveButtonText="OK"
    android:dialogTitle="ASR/VVS Server"
    android:key="SERVER_NAME"
    android:negativeButtonText="Cancel"
    android:entryValues="@array/asrServers"
    android:entries="@array/asrServers"/>