安卓自定义日历片段

安卓自定义日历片段

问题描述:

我试图创建一个自定义日历,从这个例子 Here开始,唯一的例外是我希望它在一个片段中。然而,我在这里得到一个零点错误:gridview.setAdapter(adapter);适配器类,xml和drawables都是一样的。安卓自定义日历片段

package com.projectcaruso.naturalfamilyplaning; 


import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.GregorianCalendar; 
import java.util.Locale; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 


public class CalendarFragment extends Fragment { 

public GregorianCalendar month, itemmonth;// calendar instances. 

public CalendarAdapter adapter;// adapter instance 
public Handler handler;// for grabbing some event values for showing the dot 
         // marker. 
public ArrayList<String> items; // container to store calendar items which 
           // needs showing the event marker 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    }  

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
     View view = inflater.inflate(R.layout.fragment_calendar, null); 

     Locale.setDefault(Locale.US); 
     month = (GregorianCalendar) GregorianCalendar.getInstance(); 
     itemmonth = (GregorianCalendar) month.clone(); 

     items = new ArrayList<String>(); 
     adapter = new CalendarAdapter(getActivity(), month); 

     GridView gridview = (GridView) getActivity().findViewById(R.id.gridview); 
     gridview.setAdapter(adapter); 

     handler = new Handler(); 
     handler.post(calendarUpdater); 

     TextView title = (TextView) getActivity().findViewById(R.id.title); 
     title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 

     RelativeLayout previous = (RelativeLayout) getActivity().findViewById(R.id.previous); 

     previous.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       setPreviousMonth(); 
       refreshCalendar(); 
      } 
     }); 

     RelativeLayout next = (RelativeLayout) getActivity().findViewById(R.id.next); 
     next.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       setNextMonth(); 
       refreshCalendar(); 

      } 
     }); 

     gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, 
        int position, long id) { 

       ((CalendarAdapter) parent.getAdapter()).setSelected(v); 
       String selectedGridDate = CalendarAdapter.dayString 
         .get(position); 
       String[] separatedTime = selectedGridDate.split("-"); 
       String gridvalueString = separatedTime[2].replaceFirst("^0*", 
         "");// taking last part of date. ie; 2 from 2012-12-02. 
       int gridvalue = Integer.parseInt(gridvalueString); 
       // navigate to next or previous month on clicking offdays. 
       if ((gridvalue > 10) && (position < 8)) { 
        setPreviousMonth(); 
        refreshCalendar(); 
       } else if ((gridvalue < 7) && (position > 28)) { 
        setNextMonth(); 
        refreshCalendar(); 
       } 
       ((CalendarAdapter) parent.getAdapter()).setSelected(v); 

       showToast(selectedGridDate); 

      } 
     }); 
     return view; 
    } 

    protected void setNextMonth() { 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMaximum(GregorianCalendar.MONTH)) { 
      month.set((month.get(GregorianCalendar.YEAR) + 1), 
        month.getActualMinimum(GregorianCalendar.MONTH), 1); 
     } else { 
      month.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) + 1); 
     } 

    } 

    protected void setPreviousMonth() { 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMinimum(GregorianCalendar.MONTH)) { 
      month.set((month.get(GregorianCalendar.YEAR) - 1), 
        month.getActualMaximum(GregorianCalendar.MONTH), 1); 
     } else { 
      month.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) - 1); 
     } 

    } 

    protected void showToast(String string) { 
     Toast.makeText(getActivity(), string, Toast.LENGTH_SHORT).show(); 

    } 

    public void refreshCalendar() { 
     TextView title = (TextView) getActivity().findViewById(R.id.title); 

     adapter.refreshDays(); 
     adapter.notifyDataSetChanged(); 
     handler.post(calendarUpdater); // generate some calendar items 

     title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 
    } 

    public Runnable calendarUpdater = new Runnable() { 

     @Override 
     public void run() { 
      items.clear(); 

      // Print dates of the current week 
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.US); 
      String itemvalue; 
      for (int i = 0; i < 7; i++) { 
       itemvalue = df.format(itemmonth.getTime()); 
       itemmonth.add(GregorianCalendar.DATE, 1); 
       items.add("2012-09-12"); 
       items.add("2012-10-07"); 
       items.add("2012-10-15"); 
       items.add("2012-10-20"); 
       items.add("2012-11-30"); 
       items.add("2012-11-28"); 
      } 

      adapter.setItems(items); 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
} 
+0

你好,我也面临同样的问题,我改变了所有视图查看视图,但也一次又一次地得到同样的错误。你能否标记哪里做了改变? – surhidamatya

+0

你可以发布你的代码,以便我们可以在一个新的问题中看到它,它抛出的错误和它是什么? – jcaruso

+0

嗨,感谢您的回复。我解决了它。 – surhidamatya

我猜gridview为空。你为什么不尝试改变这一行....

GridView gridview = (GridView) getActivity().findViewById(R.id.gridview); 

这... ...

GridView gridview = (GridView) view.findViewById(R.id.gridview); 

设置断点,看看是否gridview现在有一个值。

+0

我敢打赌你完全正确,因为这个观点还没有被夸大。你的正确,并修正getActivitiy的所有视图后查看它的作品!感谢这是一个很好的教程,新朋友 – jcaruso

+0

好吧,你夸大了它(onCreateView()的第一行),但是你没有引用它...... –

+0

你的权利,我只是说错了。所以视图是膨胀的,但已经返回到活动,所以引用getActvity()不工作,直到它返回的 – jcaruso