【问题标题】:How to implement Android Spinner from inside a Fragment view如何从片段视图中实现 Android Spinner
【发布时间】:2017-08-17 02:35:39
【问题描述】:

我需要在片段内实现 3 个微调器对象。但是,我得到了错误。我已经在下面发布了错误消息。

setOnItemClickListener Spinner 中的 (android.widget.AdapterView.OnItemClickListener) 不能 适用于(匿名 android.widget.AdapterView.OnItemSelectedListener)

Java 类:

public class RegisterFragment extends Fragment {
private static final String[] monthPaths = {"January", "February", "March", "April", "May", "June",
                            "July", "August", "September", "October", "November", "December"};
private static final String[] dayPaths = {"01", "02", "03", "04", "05", "06", "07", "08", "09",
        "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
        "25", "26", "27", "28", "29", "30", "31"};
private static final String[] yearPaths = {"1917", "1918", "1919", "1920", "1921", "1922",  "1923",
        "1924", "1925", "1926", "1927", "1928", "1929", "1930", "1931", "1932", "1933", "1934",
        "1935", "1936", "1937", "1938", "1939", "1940", "1941", "1942", "1943", "1944", "1945",
        "1946", "1947", "1948", "1949", "1950", "1951", "1952", "1953", "1954", "1955", "1956",
        "1957", "1958", "1959", "1960", "1961", "1962", "1963", "1964", "1965", "1966", "1967",
        "1968", "1969", "1970", "1971", "1972", "1973", "1974", "1975", "1976", "1977", "1978",
        "1979", "1980", "1981", "1982", "1983", "1984", "1985", "1986", "1987", "1988", "1989",
        "1990", "1991", "1992", "1993", "1994", "1995", "1996", "1997", "1998", "1999", "2000",
        "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011",
        "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020"};
private String monthString = null;
private String dayString = null;
private String yearString = null;

public RegisterFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_sign_up,container,false);

    final Spinner spinnerMonth = (Spinner)view.findViewById(R.id.spinner_birth_month);
    final Spinner spinnerDay = (Spinner)view.findViewById(R.id.spinner_birth_day);
    final Spinner spinnerYear = (Spinner)view.findViewById(R.id.spinner_birth_year);

    ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(view.getContext(),
            android.R.layout.simple_spinner_item, monthPaths);
    ArrayAdapter<String> dayAdapter = new ArrayAdapter<>(view.getContext(),
            android.R.layout.simple_spinner_item, monthPaths);
    ArrayAdapter<String> yearAdapter = new ArrayAdapter<>(view.getContext(),
            android.R.layout.simple_spinner_item, monthPaths);

    monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    yearAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinnerMonth.setAdapter(monthAdapter);
    spinnerDay.setAdapter(dayAdapter);
    spinnerYear.setAdapter(yearAdapter);

    spinnerMonth.setOnItemClickListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int position, long id) {
            monthString = parent.getItemAtPosition(position).toString();
        }

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

        }
    });

    spinnerDay.setOnItemClickListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int position, long id) {
            dayString = parent.getItemAtPosition(position).toString();
        }

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

        }
    });

    spinnerYear.setOnItemClickListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                                   int position, long id) {
            yearString = parent.getItemAtPosition(position).toString();
        }

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

        }
    });
    return view;

【问题讨论】:

    标签: android android-fragments view spinner


    【解决方案1】:

    Android Spinner 不支持 OnItemClickListener。使用setOnItemSelectedListener 而不是setOnItemClickListener

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

    【讨论】:

      【解决方案2】:

      你应该实现OnItemSelectedListener。不是OnItemClickListener

      示例:

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

      在您的代码中,您为所有三个适配器传递了相同的数据。

      您的代码

          ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, monthPaths);
          ArrayAdapter<String> dayAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, monthPaths);
          ArrayAdapter<String> yearAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, monthPaths);
      

      如下更改:

          ArrayAdapter<String> monthAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, monthPaths);
          ArrayAdapter<String> dayAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, dayPaths );
          ArrayAdapter<String> yearAdapter = new ArrayAdapter<>(view.getContext(),
                  android.R.layout.simple_spinner_item, yearPaths );
      

      希望对你有帮助:)

      【讨论】:

      • "你应该实现 OnItemSelectedListener。而不是 OnItemSelectedListener。"我对冗余感到有些困惑?
      • 我正在使用 spinner.setOnItemClickListener: spinnerMonth.setOnItemClickListener(new AdapterView.OnItemSelectedListener() {
      • 顺便说一句,您是否也检查了我的答案?
      • 我已经更新了答案。你应该使用 spinnerMonth.setOnItemSelectedListener
      • 将任何一个答案标记为正确答案。它将帮助其他人解决他们的问题。
      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多