Android这种时间选择器用什么控件?

时间:2023-01-31 17:15:36
Android这种时间选择器用什么控件?可以左右滑动,年份控制在 2000 年到今天。滑动停止自动获取停留在中间的年月日值。我想破脑袋不知道用什么控件。

4 个解决方案

#1


像这种定制类型的,自定义吧,我觉得可以继承horizontalScrollview实现

#2


或者用ViewPager

#3


有没有Demo可以提供参考呢?

#4


Android原生的时间选择器是:DatePicker。
要实现横移选择,肯定要自定义,至于组件,可以去继承ViewPager或者ViewFlipper都可以。

这里写一个ViewFlipper的简单例子,你根据自己需求完善。
package com.example.androiddemo.activity;
Activity类:
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.ViewFlipper;

import com.example.androiddemo.R;

public class ViewFlipperActivity extends Activity{

private ViewFlipper mFlipper;
private View centerView;//该View便为你中间的日期.
private TextView yearText;
private TextView monthAndDayText;
private GestureDetector gestureDetector = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flipper_layout);
init();
}

private void init(){
mFlipper = (ViewFlipper)findViewById(R.id.view_flipper);
centerView = LayoutInflater.from(this).inflate(R.layout.date_view, null);
yearText = (TextView)centerView.findViewById(R.id.date_year);
monthAndDayText = (TextView)centerView.findViewById(R.id.date_month_and_day);
gestureDetector = new GestureDetector(this,new MyGestureListener());
mFlipper.removeAllViews();
mFlipper.addView(centerView, 0);

centerView.setOnTouchListener(new OnTouchListener() {
// 将centerView中的触摸事件回传给gestureDetector
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});

}

private void setDate(String year,String month,String day){
yearText.setText(year);
monthAndDayText.setText(month+" "+day);
}

private void next(int flag){
mFlipper.removeAllViews();
//此处获取数据,调用setDate(String year,String month,String day);
mFlipper.addView(centerView, flag);
flag++;
}

private void prev(int flag){
mFlipper.removeAllViews();
//此处获取数据,调用setDate(String year,String month,String day);
mFlipper.addView(centerView, flag);
flag--;
}

private class MyGestureListener extends SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
int gvFlag = 0;
if (e1.getX() - e2.getX() > 120) {
// 向左滑动
next(gvFlag);
return true;
} else if (e1.getX() - e2.getX() < -120) {
// 向右滑动
prev(gvFlag);
return true;
}
return false;
}
}

}

flipper_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    

    <ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></ViewFlipper>
    
</LinearLayout>

date_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/date_year"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#904E92"
        android:textSize="16.0sp"
        android:textStyle="bold"
        />
    
    <TextView
        android:id="@+id/date_month_and_day"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#8A5F7E"
        android:textSize="14.0sp"
        android:layout_marginTop="5.0dip"
        />
    
</LinearLayout>


急着回家,没有验证,你自个验证一下,在fliper_layout.xml加两个左右箭头,然后获取日期用setDate()方法设置一下既可,大概原理是这样。

#1


像这种定制类型的,自定义吧,我觉得可以继承horizontalScrollview实现

#2


或者用ViewPager

#3


有没有Demo可以提供参考呢?

#4


Android原生的时间选择器是:DatePicker。
要实现横移选择,肯定要自定义,至于组件,可以去继承ViewPager或者ViewFlipper都可以。

这里写一个ViewFlipper的简单例子,你根据自己需求完善。
package com.example.androiddemo.activity;
Activity类:
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.ViewFlipper;

import com.example.androiddemo.R;

public class ViewFlipperActivity extends Activity{

private ViewFlipper mFlipper;
private View centerView;//该View便为你中间的日期.
private TextView yearText;
private TextView monthAndDayText;
private GestureDetector gestureDetector = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flipper_layout);
init();
}

private void init(){
mFlipper = (ViewFlipper)findViewById(R.id.view_flipper);
centerView = LayoutInflater.from(this).inflate(R.layout.date_view, null);
yearText = (TextView)centerView.findViewById(R.id.date_year);
monthAndDayText = (TextView)centerView.findViewById(R.id.date_month_and_day);
gestureDetector = new GestureDetector(this,new MyGestureListener());
mFlipper.removeAllViews();
mFlipper.addView(centerView, 0);

centerView.setOnTouchListener(new OnTouchListener() {
// 将centerView中的触摸事件回传给gestureDetector
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});

}

private void setDate(String year,String month,String day){
yearText.setText(year);
monthAndDayText.setText(month+" "+day);
}

private void next(int flag){
mFlipper.removeAllViews();
//此处获取数据,调用setDate(String year,String month,String day);
mFlipper.addView(centerView, flag);
flag++;
}

private void prev(int flag){
mFlipper.removeAllViews();
//此处获取数据,调用setDate(String year,String month,String day);
mFlipper.addView(centerView, flag);
flag--;
}

private class MyGestureListener extends SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
int gvFlag = 0;
if (e1.getX() - e2.getX() > 120) {
// 向左滑动
next(gvFlag);
return true;
} else if (e1.getX() - e2.getX() < -120) {
// 向右滑动
prev(gvFlag);
return true;
}
return false;
}
}

}

flipper_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    

    <ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></ViewFlipper>
    
</LinearLayout>

date_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/date_year"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#904E92"
        android:textSize="16.0sp"
        android:textStyle="bold"
        />
    
    <TextView
        android:id="@+id/date_month_and_day"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#8A5F7E"
        android:textSize="14.0sp"
        android:layout_marginTop="5.0dip"
        />
    
</LinearLayout>


急着回家,没有验证,你自个验证一下,在fliper_layout.xml加两个左右箭头,然后获取日期用setDate()方法设置一下既可,大概原理是这样。