2016-01-26 2 views
2

Я использую CalendarView для сохранения событий, но это не работает для некоторых устройств! Это графическое отличие (некоторые устройства нуждаются в scrool-месяцах, а некоторые устройства имеют стрелку в верхней части экрана для месяцев изменений).Android onSelectedDayChange работает по-разному для разных уровней api

Но главная проблема заключается в том, что устройства со стрелками для изменения месяца, метод onSelectedDayChange не работает (уровень 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 с Calendar View

<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(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 (календарь со стрелкой до top для месяца переключения), этот if всегда фальшивый и намерение не начинается!

Кто-нибудь может сказать мне, почему? Есть ли способ заставить его работать или каким-то образом позволить стиль CalendarView такой же для всей версии api?

+0

У меня такая же проблема. Вы нашли какое-либо решение :(? –

+0

Теперь я отправляю сообщение, чтобы вы могли видеть, как я решил проблему! Наслаждайтесь! – Dario

ответ

2

Это решение решило проблему для меня!

@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 вам просто нужно намерение, принимать события и не проверить, если пользователь прокрутите mounth (не нужно). НО, если версия < вам нужен случай else!

+0

Спасибо за ответ! <3 –

+0

oh извините за итальянский комментарий! Забыл удалить их! Теперь Я переведу, чтобы кто прочитал, лучше понять код! Наслаждайтесь! – Dario

+1

У меня есть леденец, и он все еще не работает, поэтому я изменил его на currentapiVersion> Build.VERSION_CODES.LOLLIPOP, и теперь он отлично работает. –

Смежные вопросы