【问题标题】:Android development - make a spinner look like a spinnerAndroid开发——让微调器看起来像微调器
【发布时间】:2012-09-04 18:58:06
【问题描述】:

我正在我的活动课程中以编程方式创建一个微调器。 “微调器”看起来像下拉菜单,而不是微调器。我想我希望它看起来更像一个选择器(即日期选择器/时间选择器/数字选择器),您可以在其中旋转所有文本选项。

如果有可用的文本选择器,我会使用选择器类型的小部件,但我似乎找不到这样的小部件 - 只有一个数字选择器。这是我在活动中使用的代码。

        ArrayAdapter <String>lv1List = new ArrayAdapter<String>(this.getApplicationContext(),android.R.layout.simple_spinner_item,  new String[]{"item 1","item 2","item 3"});
        Spinner sp = new Spinner(getApplicationContext());
        sp.setAdapter(lv1List);
        sp.setOnItemSelectedListener(this);

【问题讨论】:

  • 您可以将一个TextView 和两个ImageButton 与一个项目列表组合起来,以制作一个传统的微调器。
  • 我建议创建一个窄的 ListView。如果您在顶部和底部添加渐变到黑色,它将看起来很像基本的 Android Clock or Timer UI。 (这个图像有三个支持投掷手势的“轮子”,圆形效果是一种视觉错觉。)如果你不想从头开始编程,我相信你可以购买已经有这个的包.
  • 嗯,用文本而不是数字填充NumberPicker 并不太难; have a look here。如果您四处搜索,我相信您也能找到提供类似功能的自定义组件。

标签: android user-interface


【解决方案1】:

看看Android Wheel。你可以有文字或几乎任何东西。完美运行。

【讨论】:

  • 谢谢 - 我认为这正是我正在寻找的。我会检查代码并回复。
【解决方案2】:

如果您想创建自己的微调器,则可以快速(但效率低下)示例。 (适用于列表视图适配器):

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
        android:orientation="horizontal">

    <FrameLayout android:id="@+id/container"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:layout_gravity="center_vertical"
              />

    <LinearLayout android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center_vertical"
                  android:orientation="vertical">
        <Button android:id="@+id/btn_up"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="up"/>
        <Button android:id="@+id/btn_down"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="down"/>
    </LinearLayout>

</LinearLayout>

CustomSpinner 类:

public class CustomSpinner extends FrameLayout{
// ------------------------------ FIELDS ------------------------------

    private FrameLayout mContainer;
    private SpinnerAdapter mAdapter;
    private int index = 0;

// --------------------------- CONSTRUCTORS ---------------------------

    public CustomSpinner(Context context) {
        super(context);
        init(context);
    }

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context){
        this.addView(LayoutInflater.from(context).inflate(R.layout.custom_spinner,this,false));

        findViewById(R.id.btn_up).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                index--;
                refresh();
            }
        });

        findViewById(R.id.btn_down).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                index++;
                refresh();
            }
        });

        mContainer = (FrameLayout) findViewById(R.id.container);
    }

// -------------------------- OTHER METHODS --------------------------

    public void setAdapter(SpinnerAdapter adapter) {
        this.mAdapter = adapter;
        refresh();
    }

    private void refresh() {
        //----needs recycling for better performance---
        //---now, we'll just clear up--
         mContainer.removeAllViews();

        //---do we need to refresh ? -----
        if(mAdapter == null || mAdapter.getCount() == 0){return;}

        //--clamp index--
        index = Math.max(0,index);
        index = Math.min(mAdapter.getCount() - 1, index);

        //--get view and show it-----
        View currentView = mAdapter.getView(index,null,mContainer);
         mContainer.addView(currentView);
    }
}

用例:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
        >

 <com.example.CustomSpinner android:id="@+id/custom_spinner"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"
                               />
</LinearLayout>

活动:

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
                new String[]{"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"});

        ((CustomSpinner)findViewById(R.id.custom_spinner)).setAdapter(adapter);

    }
}

【讨论】:

  • 感谢您的回复。这接近我想要的,我之前考虑过这样做,但我不想要求点击按钮。列表中会有很多选项,我宁愿流畅滚动而不必点击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多