java - 如何将微调器值传递或获取到 android 中的字符串?

标签 java android android-spinner datetimeformatter

我正在尝试将值从 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);

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

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

请帮忙。

顺便说一下,整个代码都是用 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

Initial Stage at first launch

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

After I changed the spinners value

最佳答案

声明 selectdate 为静态 public static LocalDate selectdate;

创建一个名为getSelectDate 的方法并调用它来获取更改的值,例如在 onCreate 内部,在 month_spinner< 的 onItemSelected 内部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);
    //
}

这也将解决您的按钮问题。一切都很好 。 setMonthView 回滚到您的旧代码。这是你的类(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();


        }

    }
}

要获取 "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));
}


 

关于java - 如何将微调器值传递或获取到 android 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68502185/

相关文章:

java - 为什么@FunctionalInterface 有运行时保留?

android - 在 Android 函数中设置 addTextChangedListener

android在线性布局中查找复选框

java - 如何检测 Spinner 是否在 Android 上单击打开

android - 无法在 getView 中选中/取消选中 CheckedTextView

java - 无法传输 http ://repo. maven.apache.org/maven2 - 错误代码 501,需要 HTTPS

java - 如何更新启用 NETCONF 的设备上的配置?

java - 二次方程误差

android - 为什么这个 anko 布局不能正确处理系统用户界面?

android - Spinners 需要更多时间在 Android fragment 中加载 View