Editable text view with spinner android

让人想犯罪 __ 提交于 2019-12-02 05:07:11

问题


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"/>


来源:https://stackoverflow.com/questions/18711682/editable-text-view-with-spinner-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!