Search code examples
javaandroidandroid-spinnerdatetimeformatter

How to pass or get the spinner value to a string in android?


I am trying to pass the value from spinner.setOnItemSelectedListener to a string that contains date string. I have two spinners month and year, here I am showing only for month spinner because if I get the solution for month spinner then it will be same for year as well.


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) {

            }
        });

I have tried to access the spinner value like this:- String month = month_spinner.getSelectedItem().toString();

and try to pass the spinner onItemSelectListener value to combinedString string variable like this:-


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

I get the default value in the combined string that is already preselected in the spinner but when user try to change the default value that is shown in spinner it does not change the value. It gives null value in the combinedString. Can anyone help me How to pass the value from onItemSelectListener to combinedString

Is it because of the scope of a method (' { } ') or is it because of private or public variable declaration.

Please help.

By the way whole code is in JAVA. Here is complete code:-



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();
           


    }

}


I have attached two images of the output:

Initial Stage at first launch ->Image 1

Initial Stage at first launch

After I changed the spinners value ->Image 2

After I changed the spinners value


Solution

  • Declare selectdate as static public static LocalDate selectdate;

    Create a method named getSelectDate and call it to get changed value , such as inside onCreate, inside onItemSelected of month_spinner and spinYear.

     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);
        //
    }
    

    This will fix your button issue also. All is well . setMonthView roll backed to your old code . Here yours Class-

        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();
    
    
            }
    
        }
    }
    

    To get "dd/MM/yyyy" this format use DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.ENGLISH).format(selectdate); , no other changes need .

    To test -

    @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));
    }