【问题标题】:Android onSelectedDayChange works differently for different api levelAndroid onSelectedDayChange 对于不同的 api 级别的工作方式不同
【发布时间】:2016-01-26 20:43:48
【问题描述】:

我使用CalendarView 保存事件,但它不适用于某些设备! 它的图形不同(有些设备需要滚动月份,有些设备的箭头指向屏幕顶部以更改月份)。

但主要问题是带有箭头更改月份的设备,方法onSelectedDayChange不起作用(api级别23)!

这是我使用的代码

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CalendarView;


public class CalendarioActivity extends ActionBarActivity {

    CalendarView calendar;
    Long date;

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


        calendar = (CalendarView)findViewById(R.id.calendarView);
        date = calendar.getDate();

        calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {

            public void onSelectedDayChange(CalendarView view, int year, int month,
                                            int dayOfMonth) {


                /*Con questo if blocco onSelectedDayChange quando viene scrollato
                il calendario per cambiare mese*/
                if(calendar.getDate() != date) {
                    date = calendar.getDate();
                   /* Quando seleziono un giorno apro l'activity per scriverci i compiti sopra*/
                    /*Passo tramite intent giorno,mese,anno*/
                    Intent myIntent = new Intent(CalendarioActivity.this, ActivityEvento.class);
                    myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
                    startActivity(myIntent);
                }
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_calendario, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {

            case R.id.action_help:
                Intent aiuto_intent = new Intent(this, AiutoActivity.class);
                aiuto_intent.putExtra("chiamante", "calendario");
                startActivity(aiuto_intent);
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

这是带有日历视图的 xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.ddz.diarioscolastico.CalendarioActivity">


    <CalendarView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/calendarView"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:unfocusedMonthDateColor="@color/grigio_chiaro"
        android:dateTextAppearance="@android:style/TextAppearance.Large"
        android:showWeekNumber="false"/>

</RelativeLayout>

问题出在 IF

if(calendar.getDate() != date) {
   date = calendar.getDate();

   Intent myIntent = new Intent(CalendarioActivity.this,ActivityEvento.class); 
   myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
   startActivity(myIntent);

}

对于某些 api 级别(带有箭头的日历视图,顶部用于切换月份),此 if 始终为 false,并且意图不会启动!

谁能告诉我为什么? 有什么方法可以让它工作,或者让CalendarView的风格对所有api版本都一样?

【问题讨论】:

  • 我遇到了同样的问题。你有没有找到任何解决方案:(?
  • 现在我发布一个答案,以便您了解我是如何解决问题的!享受吧!

标签: android calendarview


【解决方案1】:

这个解决方案为我解决了问题!

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


    calendar = (CalendarView)findViewById(R.id.calendarView);
    date = calendar.getDate();

    calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {

        @Override
        public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {

            int currentapiVersion = android.os.Build.VERSION.SDK_INT;

            if (currentapiVersion >= Build.VERSION_CODES.LOLLIPOP){
                // Do something for lollipop and above versions

                Intent myIntent = new Intent(CalendarioActivity.this, ActivityEvento.class);
                myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
                startActivity(myIntent);
            } else{
                // do something for phones running an SDK before lollipop

                /*With this if i block onSelectedDayChange when the mounth change*/
                if(calendar.getDate() != date) {
                    date = calendar.getDate();

                    Intent myIntent = new Intent(CalendarioActivity.this, ActivityEvento.class);
                    myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
                    startActivity(myIntent);

                }
            }

        }
    });
}

正如你在这里看到的,我检查了手机的版本:

int currentapiVersion = android.os.Build.VERSION.SDK_INT;

                if (currentapiVersion >= Build.VERSION_CODES.LOLLIPOP){
                    // Do something for lollipop and above versions

                    Intent myIntent = new Intent(CalendarioActivity.this, ActivityEvento.class);
                    myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
                    startActivity(myIntent);
                } else{
                    // do something for phones running an SDK before lollipop

                    /*Con questo if blocco onSelectedDayChange quando viene scrollato
                    il calendario per cambiare mese*/
                    if(calendar.getDate() != date) {
                        date = calendar.getDate();
                   /* Quando seleziono un giorno apro l'activity per scriverci i compiti sopra*/
                    /*Passo tramite intent giorno,mese,anno*/
                        Intent myIntent = new Intent(CalendarioActivity.this, ActivityEvento.class);
                        myIntent.putExtra("day",dayOfMonth).putExtra("month", month+1).putExtra("year", year);
                        startActivity(myIntent);

                    }
                }

如果版本 >= LOLLIPOP,您只需要获取事件的意图,并且不检查用户是否滚动安装(不需要)。 但是如果版本是

【讨论】:

  • 感谢您的回复!
  • 抱歉意大利人的评论!我忘记删除它们了!现在我翻译以便阅读的人可以更好地理解代码!享受吧!
  • 我有棒棒糖,但它仍然无法正常工作,所以我将其更改为 currentapiVersion > Build.VERSION_CODES.LOLLIPOP,现在它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多