Android: получить Textview значение Spinner на кнопку click


У меня есть Spinner, и я заполняю его обычаем SimpleCursorAdapter. Spinner item layout содержит два TextViews, Один TextView для идентификатора элемента,и он не виден, другой - для имени элемента. Я хочу получить этот идентификатор элемента на кнопке click event, а затем вставить его в базу данных Sqlite. Я получаю идентификатор на setOnItemSelectedListener из Spinner как

companySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                // Get selected row data to show on screen
                String companyId = ((TextView) view.findViewById(R.id.spinnerItemIdTv)).getText().toString();
                Toast.makeText(getActivity(), companyId, Toast.LENGTH_LONG).show();
                Log.w(TAG, "companyId:" + companyId);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {


            }
        });

И Макет Элемента Spinner

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/spinnerItemIdTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#888"
        android:textSize="20sp"
        android:visibility="gone"/>

    <TextView
        android:id="@+id/spinnerItemNameTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#888"
        android:textSize="20sp" />

</LinearLayout>

Но не смог сделать это по щелчку кнопки. Любая помощь будет оценена по достоинству.

4 2

4 ответа:

Я думаю, что вы ищете это

View selectedView = null;  //Declare it as a class level variable so that you don't need to make it final  

spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedView = view;
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

И внутри события щелчка какой-нибудь кнопки сделайте вот так

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {    
                if(selectedView!=null){                        
                    String companyId = ((TextView) selectedView.findViewById(R.id.spinnerItemIdTv)).getText().toString();
                }
               else{//Something}    

            }
        });

У вас есть адаптер, связанный с вашим спиннером, и я предполагаю, что у вас есть некоторая структура данных, связанная с адаптером. Вы можете получить данные, которые вам нужны onItemSelected (что-то вроде ниже)

public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    myData = myArrayList.get(i);
//OR
    myData = myAdapter.getItem(i);
}

MyData может быть полем активности, и вы можете использовать более поздний обратный вызов onClick, связанный с вашей кнопкой.

Вы можете попробовать это

companySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            Spinner spinComp = (Spinner) view.findViewById(R.id.spinner_company);
            int selCompIndex = spinComp .getSelectedItemPosition();
            String compID = companyList.get(selCompIndex).toString();
            Toast.makeText(getActivity(), compID, Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {


        }
    });

Где, companyList - ArrayList, который вы передаете адаптеру Spinner. Надеюсь, это сработает.

Измените свой xml на single TextView и используйте tag для ID.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/spinnerItemNameTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="yourId"
        android:textColor="#888"
        android:textSize="20sp" />

</LinearLayout>

Теперь используйте setText для установки значения строки spinner и используйте setTag для установки идентификатора строки, а затем получите идентификатор следующим образом.

companySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {


                String companyId = ((TextView) view.findViewById(R.id.spinnerItemNameTv)).getTag().toString(); //use parent instead.
                Toast.makeText(getActivity(), companyId, Toast.LENGTH_LONG).show();
                Log.w(TAG, "companyId:" + companyId);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {


            }
        });