【问题标题】:How to pass or get the spinner value to a string in android?如何将微调器值传递或获取到android中的字符串?
【发布时间】:2021-07-23 16:14:44
【问题描述】:

我正在尝试将 spinner.setOnItemSelectedListener 中的值传递给包含日期字符串的字符串。我有两个月份和年份的微调器,这里我只显示月份微调器,因为如果我得到月份微调器的解决方案,那么它也将与年份相同。


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

                if (parent.getId() == R.id.month_spinner){
                    seltmont = parent.getSelectedItem().toString();

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    setMonthView();
                }

            }

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

            }
        });

我尝试像这样访问微调器值:- String month = month_spinner.getSelectedItem().toString();

并尝试将微调器onItemSelectListener 值传递给combinedString 字符串变量,如下所示:-


 combinedString = "01/" + month + "/" + year ;
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
 selectdate = LocalDate.parse(combinedString, formatter);

我在微调器中已经预选的组合字符串中获得了默认值,但是 当用户尝试更改微调器中显示的默认值时,它不会更改该值。它在组合字符串中给出空值。 谁能帮我如何将值从onItemSelectListener 传递给combinedString

是因为方法的范围('{}')还是因为私有或公共变量声明。

请帮忙。

顺便说一句,整个代码都在 JAVA 中。 这是完整的代码:-



public class MainActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener { 

    TextView monthYearText, textviewMonth,textviewYear,textviewYearnMonth;
    RecyclerView calendarReyclerView;
    LocalDate selectdate;

   private Spinner month_spinner,spinYear;
    String [] months;

    String combinedString;
    String selectedMonth;

    String seltmont;
    String selctYear;


    @SuppressLint("SetTextI18n")
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textviewMonth = findViewById(R.id.textviewMonth);
        textviewYear = findViewById(R.id.textviewYear);

        //for testing
        textviewYearnMonth = findViewById(R.id.textviewYearnMonth);

        month_spinner = findViewById(R.id.month_spinner);
        spinYear = findViewById(R.id.yearspin);


        populateSpinnerMonth();
        populateSpinnerYear();



        initWidget();
        selectdate = LocalDate.now();
        setMonthView();

       
        //---- on click listener ---//

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

                if (parent.getId() == R.id.month_spinner){
                    seltmont = parent.getSelectedItem().toString();

                    Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                    textviewMonth.setText(seltmont);
                    setMonthView();
                }

            }

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

            }
        });

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

             if (parent.getId() == R.id.yearspin){
                 selctYear = parent.getSelectedItem().toString();
                 Toast.makeText(MainActivity.this, "Selected Year" + selctYear, Toast.LENGTH_SHORT).show();
                 textviewYear.setText(selctYear);
                 setMonthView();
             }

            }

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

            }
        });


        // ---- on click listener ---//


        String month = month_spinner.getSelectedItem().toString();
        String year= spinYear.getSelectedItem().toString();



       // String month = textviewMonth.getText().toString();
        //String year = textviewYear.getText().toString();


        //combinedString = "16/09/2019";
        combinedString = "01/" + month + "/" + year ;

       // combinedString = "01/" + mon + "/" + year ;


        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
        selectdate = LocalDate.parse(combinedString, formatter);

     /*   //not working
        String mon = textviewMonth.getText().toString();
        Log.d("month","code is going here");
        textviewYearnMonth.setText(mon);
        Log.d("month","code cross the textviewYearnMonth"); */
      //  textviewYearnMonth.setText(seltmont);


    }



    private void populateSpinnerYear() {

        ArrayList<String> years = new ArrayList<String>();
        int thisYear = Calendar.getInstance().get(Calendar.YEAR);

        for (int i = 1950; i <= thisYear; i++){
            years.add(Integer.toString(i));
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,years);
        spinYear.setAdapter(adapter);

    }

    private void populateSpinnerMonth() {

        months = new DateFormatSymbols().getMonths();
        ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,months);
        monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        month_spinner.setAdapter(monthAdapter);
        

    }


    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setMonthView() {


        monthYearText.setText(monthYearFromDate(selectdate));
        ArrayList<String> daysInMonth = daysInMonthArray(selectdate);

        CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),7); //for calendar columns
        calendarReyclerView.setLayoutManager(layoutManager);
        calendarReyclerView.setAdapter(calendarAdapter);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private ArrayList<String> daysInMonthArray(LocalDate date) {

        ArrayList<String> daysInMonthArray = new ArrayList<>();
        YearMonth yearMonth = YearMonth.from(date);

        int daysInMonth = yearMonth.lengthOfMonth();

        LocalDate firstOfMonth = selectdate.withDayOfMonth(1);
        int dayOfWeek = firstOfMonth.getDayOfWeek().getValue();

        for(int i = 1; i <= 42; i++)
        {
            if(i <= dayOfWeek || i > daysInMonth + dayOfWeek)
            {
                daysInMonthArray.add("");
            }
            else
            {
                daysInMonthArray.add(String.valueOf(i - dayOfWeek));
            }
        }
        return  daysInMonthArray;

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private String monthYearFromDate(LocalDate date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");
        return date.format(formatter);
    }

    private void initWidget() {

        calendarReyclerView = findViewById(R.id.calendarRecyclerView);
        monthYearText = findViewById(R.id.monthYearTV);

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void previousMonthAction(View view) {



        selectdate = selectdate.minusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void nextMonthAction(View view) {

        selectdate = selectdate.plusMonths(1);
        setMonthView();

    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onItemClick(int position, String dayText) {

        if(!dayText.equals(""))
        {
            String message = "Selected Date " + dayText + " " + monthYearFromDate(selectdate);
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
           


    }

}


我附上了两张输出图片:

首次发布的初始阶段 ->图片 1

在我更改微调器值后 ->Image 2

【问题讨论】:

    标签: java android android-spinner datetimeformatter


    【解决方案1】:

    selectdate 声明为静态public static LocalDate selectdate;

    创建一个名为getSelectDate的方法并调用它以获取更改的值,例如onCreate内部、month_spinnerspinYear内部onItemSelected

     private void getSelectDate() {
        //added
        String month = month_spinner.getSelectedItem().toString();
        String year = spinYear.getSelectedItem().toString();
    
    
        //String month = textviewMonth.getText().toString();
        //String year = textviewYear.getText().toString();
    
    
        //combinedString = "16/09/2019";
        combinedString = "01/" + month + "/" + year;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
        selectdate = LocalDate.parse(combinedString, formatter);
        //
    }
    

    这也将解决您的按钮问题。一切都很好 。 setMonthView 回滚到您的旧代码。这是你的课-

        public class MainActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener {
    
        TextView monthYearText, textviewMonth, textviewYear, textviewYearnMonth;
        RecyclerView calendarReyclerView;
        public static LocalDate selectdate;
    
        private Spinner month_spinner, spinYear;
        String[] months;
    
        String combinedString;
        String selectedMonth;
    
        String seltmont;
        String selctYear;
    
    
        @SuppressLint("SetTextI18n")
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            textviewMonth = findViewById(R.id.textviewMonth);
            textviewYear = findViewById(R.id.textviewYear);
    
            //for testing
            textviewYearnMonth = findViewById(R.id.textviewYearnMonth);
    
            month_spinner = findViewById(R.id.month_spinner);
            spinYear = findViewById(R.id.yearspin);
    
    
            populateSpinnerMonth();
            populateSpinnerYear();
    
    
            initWidget();
            //   selectdate = LocalDate.now();
            getSelectDate();
            setMonthView();
    
    
            //---- on click listener ---//
    
            month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
                    if (parent.getId() == R.id.month_spinner) {
                        seltmont = parent.getSelectedItem().toString();
    
                        Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                        textviewMonth.setText(seltmont);
                        //added
                        getSelectDate();
                        updateView();
                        setMonthView();
    
    
                    }
    
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    
            spinYear.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
                    if (parent.getId() == R.id.yearspin) {
                        selctYear = parent.getSelectedItem().toString();
                        Toast.makeText(MainActivity.this, "Selected Year" + selctYear, Toast.LENGTH_SHORT).show();
                        textviewYear.setText(selctYear);
                        getSelectDate();
                        updateView();
                        setMonthView();
                    }
    
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    
    
            // ---- on click listener ---//
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private void getSelectDate() {
            //added
            String month = month_spinner.getSelectedItem().toString();
            String year = spinYear.getSelectedItem().toString();
    
    
            //String month = textviewMonth.getText().toString();
            //String year = textviewYear.getText().toString();
    
    
            //combinedString = "16/09/2019";
            combinedString = "01/" + month + "/" + year;
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMMM/yyyy");
            selectdate = LocalDate.parse(combinedString, formatter);
            //
        }
    
        //added
        private void updateView() {
    
            // combinedString = "01/" + mon + "/" + year ;
    
            //not working
            String mon = textviewMonth.getText().toString();
            //  Log.d("month","code is going here");
            //  textviewYearnMonth.setText(mon);
            // Log.d("month","code cross the textviewYearnMonth");
            textviewYearnMonth.setText(mon);
        }
    
    
        private void populateSpinnerYear() {
    
            ArrayList<String> years = new ArrayList<String>();
            int thisYear = Calendar.getInstance().get(Calendar.YEAR);
    
            for (int i = 1950; i <= thisYear; i++) {
                years.add(Integer.toString(i));
            }
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, years);
            spinYear.setAdapter(adapter);
    
        }
    
        private void populateSpinnerMonth() {
    
            months = new DateFormatSymbols().getMonths();
            ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, months);
            monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            month_spinner.setAdapter(monthAdapter);
    
    
        }
    
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private void setMonthView() {
            monthYearText.setText(monthYearFromDate(selectdate));
            ArrayList<String> daysInMonth = daysInMonthArray(selectdate);
            CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
            RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 7); //for calendar columns
            calendarReyclerView.setLayoutManager(layoutManager);
            calendarReyclerView.setAdapter(calendarAdapter);
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private ArrayList<String> daysInMonthArray(LocalDate date) {
    
            ArrayList<String> daysInMonthArray = new ArrayList<>();
            YearMonth yearMonth = YearMonth.from(date);
    
            int daysInMonth = yearMonth.lengthOfMonth();
    
            LocalDate firstOfMonth = selectdate.withDayOfMonth(1);
            int dayOfWeek = firstOfMonth.getDayOfWeek().getValue();
    
            for (int i = 1; i <= 42; i++) {
                if (i <= dayOfWeek || i > daysInMonth + dayOfWeek) {
                    daysInMonthArray.add("");
                } else {
                    daysInMonthArray.add(String.valueOf(i - dayOfWeek));
                }
            }
            return daysInMonthArray;
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private String monthYearFromDate(LocalDate date) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");
            return date.format(formatter);
        }
    
        private void initWidget() {
    
            calendarReyclerView = findViewById(R.id.calendarRecyclerView);
            monthYearText = findViewById(R.id.monthYearTV);
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        public void previousMonthAction(View view) {
    
    
            selectdate = selectdate.minusMonths(1);
            setMonthView();
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        public void nextMonthAction(View view) {
    
            selectdate = selectdate.plusMonths(1);
            setMonthView();
    
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        public void onItemClick(int position, String dayText) {
    
            if (!dayText.equals("")) {
                String message = "Selected Date " + dayText + " " + monthYearFromDate(selectdate);
                Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    
    
            }
    
        }
    }
    

    要获得"dd/MM/yyyy"这种格式使用DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH).format(selectdate);,无需其他更改。

    测试-

    @RequiresApi(api = Build.VERSION_CODES.O)
    private void updateView() {
    
        // combinedString = "01/" + mon + "/" + year ;
    
        //not working
        String mon = textviewMonth.getText().toString();
        //  Log.d("month","code is going here");
        //  textviewYearnMonth.setText(mon);
        // Log.d("month","code cross the textviewYearnMonth");
        textviewYearnMonth.setText(DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH).format(selectdate));
    }
    
    
     
    

    【讨论】:

    • 对不起,我没有提到,但是是的,我已经将 selectdate 初始化为 LocalDate。但这不起作用。我想知道如何从spinner.setOnItemSelectedListener() 中获取我已将String selectMonth = parent.getSelectedItem().toString(); 初始化为combinedString 的值。我试图将selectMonth 的值存储在combinedString 中,但这会给出空值。问题出在方法的范围内,我不知道如何从任何方法的内部范围到外部范围获取或访问值。
    • 请立即检查,按钮问题应该已修复。
    • yearMonth.getMonthValue();
    • 请检查更新格式 "dd/MM/yyyy" ,忽略 getMonthValue() ,在这种情况下是不必要的。
    • @Andrew 尝试将dayText+"/MM/yyyy" 放入onItemClick 函数中。所以整个代码将是:textviewYearnMonth.setText(DateTimeFormatter.ofPattern(dayText+"/MM/yyyy",Locale.ENGLISH).format(selectdate));
    【解决方案2】:

    在 onItemSelected 回调中,只需使用带有位置变量的数据源即可。例如月份微调器:

     month_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
                    if (parent.getId() == R.id.month_spinner){
                        seltmont = months[position]; // ATTENTION HERE
    
                        Toast.makeText(MainActivity.this, "Selected Month: " + seltmont, Toast.LENGTH_SHORT).show();
                        textviewMonth.setText(seltmont);
                        setMonthView();
                    }
    
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    

    对所有微调器侦听器执行相同操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多