【问题标题】:Populating spinner directly in the layout xml直接在布局 xml 中填充微调器
【发布时间】:2010-10-27 01:14:42
【问题描述】:

是否可以在布局 xml 中填充 Spinner 的选项? This page 建议我应该使用 ArrayAdapter?做不到好像很尴尬..

【问题讨论】:

    标签: android


    【解决方案1】:

    我不确定,但请试一试。

    在你的 strings.xml 中定义:

    <string-array name="array_name">
    <item>Array Item One</item>
    <item>Array Item Two</item>
    <item>Array Item Three</item>
    </string-array>
    

    在您的布局中:

    <Spinner 
            android:id="@+id/spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:drawSelectorOnTop="true"
            android:entries="@array/array_name"
        />
    

    我听说这并不总是适用于设计器,但它编译得很好。

    【讨论】:

    • 只是想补充一点,如果您想要每个选定项目的单独值,您可以指定android:entryValues="@array/array_name_values"
    • 一个简短的说明...据我了解,微调器不支持drawSelectorOnTop,因为除了微调器本身之外没有单独的选择器。该解决方案确实有效,谢谢!
    • @ΕГИІИО Spinner 确实支持android:entryValues。 ListPreference 确实支持它。
    • @TalkLittle 这是最近的弃用吗?在撰写本文时,它确实有效。
    • @blindstuff 很容易验证。查看SpinnerAbsSpinner的源码。在 API 19 和 23 上,AbsSpinner 构造函数都使用了R.styleable.AbsSpinner_entries,但它们在任何地方都没有使用entryValues。您的代码正在执行您的预期,这只是一个巧合。 (或者也许某些制造商的 ROM 有一个自定义 Spinner 实现,实际上可以处理 android:entryValues?)
    【解决方案2】:

    在您的 String.xml 文件中定义它并将数组命名为您想要的名称,例如“重量”

    <string-array name="Weight">
    <item>Kg</item>
    <item>Gram</item>
    <item>Tons</item>
    </string-array>
    

    你的 layout.xml 中的这段代码

    <Spinner 
            android:id="@+id/fromspin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:entries="@array/Weight"
     />
    

    在您的 java 文件中,getActivity 用于片段;如果您在活动中编写该代码,则删除getActivity

    a = (Spinner) findViewById(R.id.fromspin);
    
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getActivity(),
                    R.array.weight, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
            a.setAdapter(adapter);
            a.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                    if (a.getSelectedItem().toString().trim().equals("Kilogram")) {
                        if (!b.getText().toString().isEmpty()) {
                            float value1 = Float.parseFloat(b.getText().toString());
                            float kg = value1;
                            c.setText(Float.toString(kg));
                            float gram = value1 * 1000;
                            d.setText(Float.toString(gram));
                            float carat = value1 * 5000;
                            e.setText(Float.toString(carat));
                            float ton = value1 / 908;
                            f.setText(Float.toString(ton));
                        }
    
                    }
    
    
    
                public void onNothingSelected(AdapterView<?> parent) {
                    // Another interface callback
                }
            });
            // Inflate the layout for this fragment
            return v;
        }
    

    【讨论】:

      【解决方案3】:

      关于第一条评论:如果你这样做,你会得到一个错误(在 Android Studio 中)。这是因为它不在 Android 命名空间中。如果您不知道如何修复此错误,请查看下面的示例。希望这会有所帮助!

      示例-之前:

      <string-array name="roomSize">
          <item>Small(0-4)</item>
          <item>Medium(4-8)</item>
          <item>Large(9+)</item>
      </string-array>
      

      示例 - 之后:

      <string-array android:name="roomSize">
          <item>Small(0-4)</item>
          <item>Medium(4-8)</item>
          <item>Large(9+)</item>
      </string-array>
      

      【讨论】:

      • 不起作用。 XML 文件希望他的string-array 具有name 属性,并且无法识别android:name 属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2016-04-29
      相关资源
      最近更新 更多