2015-01-02 2 views
0

Я пытаюсь получить значение Datepicker внутри одного из моих фрагментов. Я прочитал документацию о Fragments в Руководстве разработчика Android.Использование класса (DatePicker) инсайдерского фрагмента на Android

Вот мой фрагмент макет:

<ir.smartlab.persindatepicker.PersianDatePicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
     <Button 
     android:id="@+id/btnCheckFal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/relativeLayout1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="19dp" 
     android:text="@string/CheckFal" /> 
</RelativeLayout> 

Это мой Java-класс для фрагмента:

import ir.smartlab.persindatepicker.util.PersianCalendar; 
public class HomeFragment extends Fragment { 

    private View btnCheckFalAction; 
    private PersianDatePicker persianDatePicker; 

    public HomeFragment(){} 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
       btnCheckFalAction = (Button) rootView.findViewById(R.id.btnCheckFal); 

       PersianCalendar pCal = persianDatePicker.getDisplayPersianDate(); 


       btnCheckFalAction.setOnClickListener(new OnClickListener() {   
        @Override 
         public void onClick(View v) 
         {   

          Toast.makeText(getActivity(), "Date is : " + pCal , Toast.LENGTH_LONG).show(); 
         }  
        }); 

      return rootView; 
     } 
} 

PCAL в обратной ошибке выше класса «не может относиться к не- конечная переменная pCal внутри внутреннего класса ... »

и вот класс DatePicker :

package ir.smartlab.persindatepicker; 

import info.androidhive.slidingmenu.R; 
import ir.smartlab.persindatepicker.util.PersianCalendar; 
import ir.smartlab.persindatepicker.util.PersianCalendarConstants; 
import ir.smartlab.persindatepicker.util.PersianCalendarUtils; 

import java.util.Date; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.os.Parcel; 
import android.os.Parcelable; 
import android.util.AttributeSet; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.NumberPicker; 

public class PersianDatePicker extends LinearLayout { 

    private NumberPicker yearNumberPicker; 
    private NumberPicker monthNumberPicker; 
    private NumberPicker dayNumberPicker; 

    private int minYear; 
    private int maxYear; 
    private int yearRange; 

    public PersianDatePicker(Context context) { 
     this(context, null, -1); 
    } 

    public PersianDatePicker(Context context, AttributeSet attrs) { 
     this(context, attrs, -1); 
    } 

    public PersianDatePicker(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View view = inflater.inflate(R.layout.sl_persian_date_picker, this); 
     yearNumberPicker = (NumberPicker) view.findViewById(R.id.yearNumberPicker); 
     monthNumberPicker = (NumberPicker) view.findViewById(R.id.monthNumberPicker); 
     dayNumberPicker = (NumberPicker) view.findViewById(R.id.dayNumberPicker); 

     PersianCalendar pCalendar = new PersianCalendar(); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PersianDatePicker, 0, 0); 

     yearRange = a.getInteger(R.styleable.PersianDatePicker_yearRange, 10); 

     /* 
     * Initializing yearNumberPicker min and max values If minYear and 
     * maxYear attributes are not set, use (current year - 10) as min and 
     * (current year + 10) as max. 
     */ 
     minYear = a.getInt(R.styleable.PersianDatePicker_minYear, pCalendar.getPersianYear() - yearRange); 
     maxYear = a.getInt(R.styleable.PersianDatePicker_maxYear, pCalendar.getPersianYear() + yearRange); 
     yearNumberPicker.setMinValue(minYear); 
     yearNumberPicker.setMaxValue(maxYear); 

     int selectedYear = a.getInt(R.styleable.PersianDatePicker_selectedYear, pCalendar.getPersianYear()); 
     if (selectedYear > maxYear || selectedYear < minYear) { 
      throw new IllegalArgumentException(String.format("Selected year (%d) must be between minYear(%d) and maxYear(%d)", selectedYear, minYear, maxYear)); 
     } 
     yearNumberPicker.setValue(selectedYear); 
     yearNumberPicker.setOnValueChangedListener(dateChangeListener); 

     /* 
     * initializng monthNumberPicker 
     */ 
     boolean displayMonthNames = a.getBoolean(R.styleable.PersianDatePicker_displayMonthNames, false); 
     monthNumberPicker.setMinValue(1); 
     monthNumberPicker.setMaxValue(12); 
     if (displayMonthNames) { 
      monthNumberPicker.setDisplayedValues(PersianCalendarConstants.persianMonthNames); 
     } 
     int selectedMonth = a.getInteger(R.styleable.PersianDatePicker_selectedMonth, pCalendar.getPersianMonth()); 
     if (selectedMonth < 1 || selectedMonth > 12) { 
      throw new IllegalArgumentException(String.format("Selected month (%d) must be between 1 and 12", selectedMonth)); 
     } 
     monthNumberPicker.setValue(selectedMonth); 
     monthNumberPicker.setOnValueChangedListener(dateChangeListener); 

     /* 
     * initializiing dayNumberPicker 
     */ 
     dayNumberPicker.setMinValue(1); 
     dayNumberPicker.setMaxValue(31); 
     int selectedDay = a.getInteger(R.styleable.PersianDatePicker_selectedDay, pCalendar.getPersianDay()); 
     if (selectedDay > 31 || selectedDay < 1) { 
      throw new IllegalArgumentException(String.format("Selected day (%d) must be between 1 and 31", selectedDay)); 
     } 
     if (selectedMonth > 6 && selectedMonth < 12 && selectedDay == 31) { 
      selectedDay = 30; 
     } else { 
      boolean isLeapYear = PersianCalendarUtils.isPersianLeapYear(selectedYear); 
      if (isLeapYear && selectedDay == 31) { 
       selectedDay = 30; 
      } else if (selectedDay > 29) { 
       selectedDay = 29; 
      } 
     } 
     dayNumberPicker.setValue(selectedDay); 
     dayNumberPicker.setOnValueChangedListener(dateChangeListener); 

     a.recycle(); 
    } 

    NumberPicker.OnValueChangeListener dateChangeListener = new NumberPicker.OnValueChangeListener() { 

     @Override 
     public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
      int year = yearNumberPicker.getValue(); 
      boolean isLeapYear = PersianCalendarUtils.isPersianLeapYear(year); 

      int month = monthNumberPicker.getValue(); 
      int day = dayNumberPicker.getValue(); 

      if (month < 7) { 
       dayNumberPicker.setMinValue(1); 
       dayNumberPicker.setMaxValue(31); 
      } else if (month > 6 && month < 12) { 
       if (day == 31) { 
        dayNumberPicker.setValue(30); 
       } 
       dayNumberPicker.setMinValue(1); 
       dayNumberPicker.setMaxValue(30); 
      } else if (month == 12) { 
       if (isLeapYear) { 
        if (day == 31) { 
         dayNumberPicker.setValue(30); 
        } 
        dayNumberPicker.setMinValue(1); 
        dayNumberPicker.setMaxValue(30); 
       } else { 
        if (day > 29) { 
         dayNumberPicker.setValue(29); 
        } 
        dayNumberPicker.setMinValue(1); 
        dayNumberPicker.setMaxValue(29); 
       } 
      } 
     } 
    }; 

    public Date getDisplayDate() { 
     PersianCalendar displayPersianDate = new PersianCalendar(); 
     displayPersianDate.setPersianDate(yearNumberPicker.getValue(), monthNumberPicker.getValue(), dayNumberPicker.getValue()); 
     return displayPersianDate.getTime(); 
    } 

    public void setDisplayDate(Date displayDate) { 
     setDisplayPersianDate(new PersianCalendar(displayDate.getTime())); 
    } 

    public PersianCalendar getDisplayPersianDate() { 
     PersianCalendar displayPersianDate = new PersianCalendar(); 
     displayPersianDate.setPersianDate(yearNumberPicker.getValue(), monthNumberPicker.getValue(), dayNumberPicker.getValue()); 
     return displayPersianDate; 
    } 

    public void setDisplayPersianDate(PersianCalendar displayPersianDate) { 
     int year = displayPersianDate.getPersianYear(); 
     int month = displayPersianDate.getPersianMonth(); 
     int day = displayPersianDate.getPersianDay(); 
     if (month > 6 && month < 12 && day == 31) { 
      day = 30; 
     } else { 
      boolean isLeapYear = PersianCalendarUtils.isPersianLeapYear(year); 
      if (isLeapYear && day == 31) { 
       day = 30; 
      } else if (day > 29) { 
       day = 29; 
      } 
     } 
     dayNumberPicker.setValue(day); 

     minYear = year - yearRange; 
     maxYear = year + yearRange; 
     yearNumberPicker.setMinValue(minYear); 
     yearNumberPicker.setMaxValue(maxYear); 

     yearNumberPicker.setValue(year); 
     monthNumberPicker.setValue(month); 
     dayNumberPicker.setValue(day); 
    } 

    @Override 
    protected Parcelable onSaveInstanceState() { 
     // begin boilerplate code that allows parent classes to save state 
     Parcelable superState = super.onSaveInstanceState(); 
     SavedState ss = new SavedState(superState); 
     // end 

     ss.datetime = this.getDisplayDate().getTime(); 
     return ss; 
    } 

    @Override 
    protected void onRestoreInstanceState(Parcelable state) { 
     // begin boilerplate code so parent classes can restore state 
     if (!(state instanceof SavedState)) { 
      super.onRestoreInstanceState(state); 
      return; 
     } 

     SavedState ss = (SavedState) state; 
     super.onRestoreInstanceState(ss.getSuperState()); 
     // end 

     setDisplayDate(new Date(ss.datetime)); 
    } 

    static class SavedState extends BaseSavedState { 
     long datetime; 

     SavedState(Parcelable superState) { 
      super(superState); 
     } 

     private SavedState(Parcel in) { 
      super(in); 
      this.datetime = in.readLong(); 
     } 

     @Override 
     public void writeToParcel(Parcel out, int flags) { 
      super.writeToParcel(out, flags); 
      out.writeLong(this.datetime); 
     } 

     // required field that makes Parcelables from a Parcel 
     public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { 
      @Override 
      public SavedState createFromParcel(Parcel in) { 
       return new SavedState(in); 
      } 

      @Override 
      public SavedState[] newArray(int size) { 
       return new SavedState[size]; 
      } 
     }; 
    } 

} 

ответ

0

Объявите переменную pCal как final и инициализируйте представление persianDatePicker с помощью findViewById(). Вы можете изменить код так,

btnCheckFalAction = (Button) rootView.findViewById(R.id.btnCheckFal); 
    persianDatePicker = (PersianDatePicker) rootView.findViewById(R.id.persianDatePicker); 
    PersianCalendar pCal = persianDatePicker.getDisplayPersianDate(); 

, а также редактировать XML, как это,

<ir.smartlab.persindatepicker.PersianDatePicker 
     android:id="@+id/persianDatePicker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
+0

Спасибо, но это не поможет, добавив final перед объявлением pcal. все еще сбой –

+0

Может быть, persianDatePicker не инициализирован. – Krish

+0

Вы бы это разработали?! на catlog много ошибок. но я могу видеть выбор даты, и я могу изменить значение, но часть, которую я нажимаю на кнопку отправки, является проблемой, и я не могу прочитать значение –

0

Это просто.
Сделайте pCal окончательным, если вам не нужно изменять его значение во время выполнения.
OR
Введите pCal переменную класса, если у вас нет проблем с более широкой областью.

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