【问题标题】:How to show only date bar in a CalendarView?如何在 CalendarView 中仅显示日期栏?
【发布时间】:2019-07-06 17:11:24
【问题描述】:

我只想显示CalendarView 的这一部分,不显示日历

这样只有日期和箭头可见。


我找不到我是否应该自己实现它,或者是否有一些解决方法或其他一些View 可以帮助我实现这种外观。

提前致谢。

【问题讨论】:

  • 我认为您必须创建自己的自定义日期选择器。我不确定您是否可以自定义现有的 DatePicker 以仅显示顶部。

标签: android user-interface material-design android-calendar


【解决方案1】:

您可以通过创建自定义当前日期视图来获取它,如下所示,

------- activity_main.xml --------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/margin_60dp"
    android:orientation="horizontal"
    android:paddingTop="@dimen/margin_10dp"
    android:paddingBottom="@dimen/margin_10dp">
    <ImageButton
        android:id="@+id/backBtn"
        android:layout_width="@dimen/margin_40dp"
        android:layout_height="@dimen/margin_40dp"
        android:layout_margin="@dimen/margin_10dp"
        android:layout_gravity="center"
        android:background="@drawable/ic_action_back" />
    <TextView
        android:id="@+id/current_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="Current Date"
        android:textSize="18sp"
        android:textStyle="bold" />
    <ImageButton
        android:id="@+id/nextBtn"
        android:layout_width="@dimen/margin_40dp"
        android:layout_gravity="center"
        android:layout_height="@dimen/margin_40dp"
        android:layout_margin="@dimen/margin_10dp"
        android:background="@drawable/ic_action_next" />
</LinearLayout>

----- MainActivity.java ------

public class MainActivity extends AppCompatActivity {
ImageButton nextBtn, backBtn;
TextView CurrentDate;
private static final int MAX_CALENDAR_DAYS = 42;
Calendar calendar = Calendar.getInstance(Locale.ENGLISH);
List<Date> dates = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM YYYY", Locale.ENGLISH);
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    backBtn = (ImageButton) findViewById(R.id.backBtn);
    nextBtn = (ImageButton) findViewById(R.id.nextBtn);
    CurrentDate = (TextView) findViewById(R.id.current_date);
    backBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            calendar.add(Calendar.MONTH, -1);
            SetUpCalendar();
        }
    });
    nextBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            calendar.add(Calendar.MONTH, 1);
            SetUpCalendar();
        }
    });
}
private void SetUpCalendar() {
    String currentDate = dateFormat.format(calendar.getTime());
    CurrentDate.setText(currentDate);
    dates.clear();
    Calendar monthCalendar = (Calendar) calendar.clone();
    monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
    int FirstDayofMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) - 1;
    monthCalendar.add(Calendar.DAY_OF_MONTH, -FirstDayofMonth);
    while (dates.size() < MAX_CALENDAR_DAYS) {
        dates.add(monthCalendar.getTime());
        monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
    }
}

}

这可能会对你有所帮助!

【讨论】:

    【解决方案2】:

    您必须创建自己的自定义日期选择器。或许this tutorial可以帮到你。

    【讨论】:

      【解决方案3】:

      我找不到如何使用 CalendarView 制作这样的内联日历,所以我想出了自己的实现:
      -------inline_calendar.xml-------

      <LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:orientation="horizontal"
          android:gravity="center_vertical"
          xmlns:android="http://schemas.android.com/apk/res/android">
      
          <Button
              android:id="@+id/calendar_prev_button"
              android:layout_width="24dp"
              android:layout_height="24dp"
              android:layout_marginEnd="40dp"
              android:layout_marginRight="40dp"
              android:background="@drawable/ic_baseline_chevron_left_24px" />
      
          <TextView
              android:id="@+id/display_date"
              android:layout_width="wrap_content"
              android:layout_height="80dp"
              android:gravity="center"
              android:text="Feb 2019"
              android:textAppearance="@android:style/TextAppearance.Large"
              android:textColor="#222222"
              android:textSize="30sp"
              android:textStyle="bold" />
      
          <Button
              android:id="@+id/calendar_next_button"
              android:layout_width="24dp"
              android:layout_height="24dp"
              android:layout_marginStart="40dp"
              android:layout_marginLeft="40dp"
              android:background="@drawable/ic_baseline_chevron_right_24px" />
      </LinearLayout>
      

      -------InlineCalendar.java-------

      public class InlineCalendar extends LinearLayout {
          private Button btnPrev;
          private Button btnNext;
          private TextView tvDate;
          private Calendar calendar = Calendar.getInstance();
          private MyOnClickListener myOnClickListener;
          private static final String TAG = "InlineCalendar";
      
          public InlineCalendar(Context context, AttributeSet attrs) {
              super(context, attrs);
              initControl(context);
              initInterface();
          }
      
          public void setListener(MyOnClickListener myOnClickListener) {
              this.myOnClickListener = myOnClickListener;
          }
      
          public Calendar getCalendar() {
              return calendar;
          }
      
          private void assignUiElements() {
              // layout is inflated, assign local variables to components
              btnPrev = findViewById(R.id.calendar_prev_button);
              btnNext = findViewById(R.id.calendar_next_button);
              tvDate = findViewById(R.id.display_date);
          }
      
          private void initInterface() {
              myOnClickListener = new MyOnClickListener() {
                  @Override
                  public void onClickListener() {
                  }
              };
          }
      
          private void assignClickHandlers() {
              assignOnClickListener(btnPrev, -1);
              assignOnClickListener(btnNext, 1);
              btnNext.setVisibility(View.INVISIBLE);
          }
      
          private void assignOnClickListener(final Button btn, final int addMonth) {
              btn.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      updateCalendar(addMonth);
                      myOnClickListener.onClickListener();
                      boolean condition = (Calendar.getInstance().get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&
                              Calendar.getInstance().get(Calendar.YEAR) == calendar.get(Calendar.YEAR));
                      btnNext.setVisibility(condition ? View.INVISIBLE : View.VISIBLE);
                  }
              });
          }
      
          private void initControl(Context context) {
              LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              inflater.inflate(R.layout.inline_calendar, this);
      
              assignUiElements();
              assignClickHandlers();
      
              updateCalendar(0);
          }
      
          public void updateCalendar(int addMonth) {
              calendar.add(Calendar.MONTH, addMonth);
              tvDate.setText(calendarToString());
          }
      
          private String calendarToString() {
              SimpleDateFormat date_format = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
              return date_format.format(calendar.getTime());
          }
      
          public interface MyOnClickListener {
              void onClickListener();
          }
      }
      

      要使用InlineCalendar,在Activity's XML 中包含以下代码就足够了:

      <com.example.Activity.InlineCalendar
              android:id="@+id/inlineCalendar"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
      

      此外,您可以使用setListener(MyOnClickListener myOnClickListener) 方法将自定义侦听器分配给上一个和下一个按钮,就像在CalendarView 中一样

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多