Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在日历中标记从日期选择器选择的日期_Android_Date_Datetime_Custom Controls - Fatal编程技术网

Android 在日历中标记从日期选择器选择的日期

Android 在日历中标记从日期选择器选择的日期,android,date,datetime,custom-controls,Android,Date,Datetime,Custom Controls,我想在“日期选择器”中自动选择的自定义日历中标记日期。我的日期选择器位于一个活动中,日历位于另一个活动中。因此,我还希望,当我从日期选择器中选择日期后单击“保存”按钮时,它会自动打开带有所选日期标记的自定义日历。提前谢谢。如果我需要在这里提供更多信息,一定要告诉我。 这是我通过日期和时间选择器选择日期和时间的主要活动的代码: package com.example.scheduler; import java.util.Calendar; import java.util.Date; imp

我想在“日期选择器”中自动选择的自定义日历中标记日期。我的日期选择器位于一个活动中,日历位于另一个活动中。因此,我还希望,当我从日期选择器中选择日期后单击“保存”按钮时,它会自动打开带有所选日期标记的自定义日历。提前谢谢。如果我需要在这里提供更多信息,一定要告诉我。 这是我通过日期和时间选择器选择日期和时间的主要活动的代码:

package com.example.scheduler;

import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public class MainActivity extends Activity {

public TextView mDateDisplay;
public Button mPickDate;
private int mYear;
private int mMonth;
private int mDay;
private TextView mTimeDisplay;
private Button mPickTime;
private Button mSubmit;
private int mhour;
private int mminute;
private Date date;
public EditText mName;
static final int TIME_DIALOG_ID = 1;

static final int DATE_DIALOG_ID = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDateDisplay =(TextView)findViewById(R.id.date);
    mPickDate =(Button)findViewById(R.id.datepicker);
    mTimeDisplay = (TextView) findViewById(R.id.time);
    mPickTime = (Button) findViewById(R.id.timepicker);
    mName = (EditText) findViewById(R.id.name);

    //Pick time's click event listener
    mPickTime.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            showDialog(TIME_DIALOG_ID);
        }

    });

    //PickDate's click event listener// 
    mPickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);

        }
    });


    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    mhour = c.get(Calendar.HOUR_OF_DAY);
    mminute = c.get(Calendar.MINUTE);


}

//update date//    
private void updateDate() {

      mDateDisplay.setText(
        new StringBuilder()
                // Month is 0 based so add 1
                .append(mDay).append("/")
                .append(mMonth + 1).append("/")
                .append(mYear).append(" "));
    showDialog(TIME_DIALOG_ID);

     }

  //update time//    
public void updatetime()
{
    mTimeDisplay.setText(
            new StringBuilder()
                    .append(pad(mhour)).append(":")
                    .append(pad(mminute))); 
}

        private static String pad(int c) {
                    if (c >= 10)
                            return String.valueOf(c);
                        else
                                return "0" + String.valueOf(c);
                        }




//Datepicker dialog generation // 

private DatePickerDialog.OnDateSetListener mDateSetListener =
    new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, 
                              int monthOfYear, int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            updateDate();
        }
    };


 // Timepicker dialog generation//
    private TimePickerDialog.OnTimeSetListener mTimeSetListener =
         new TimePickerDialog.OnTimeSetListener() {
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                mhour = hourOfDay;
                mminute = minute;
                updatetime();
                //Intent intent = new Intent(MainActivity.this, Alert.class);
                //startActivity(intent);
                String Date = mDateDisplay.getText().toString();
                String Time = mTimeDisplay.getText().toString();
                String Name = mName.getText().toString();
                Intent intent1 = new Intent(MainActivity.this,Alert.class); 
                intent1.putExtra("mDateDisplay", Date); 
                intent1.putExtra("mTimeDisplay", Time);
                intent1.putExtra("mName", Name);
                startActivity(intent1);


            }


        };

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,
                        mDateSetListener,
                        mYear, mMonth, mDay);

        case TIME_DIALOG_ID:
            return new TimePickerDialog(this,
                    mTimeSetListener, mhour, mminute, false);

        }
        return null;
    }

}


Now below is my calendar adapter and calendar view classes:

package com.example.scheduler;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CalendarAdapter extends BaseAdapter {
    private Context mContext;

    private java.util.Calendar month;
    public GregorianCalendar pmonth; // calendar instance for previous month
    /**
     * calendar instance for previous month for getting complete view
     */
    public GregorianCalendar pmonthmaxset;
    private GregorianCalendar selectedDate;
    int firstDay;
    int maxWeeknumber;
    int maxP;
    int calMaxP;
    int lastWeekDay;
    int leftDays;
    int mnthlength;
    String itemvalue, curentDateString;
    DateFormat df;

    private ArrayList<String> items;
    public static List<String> dayString;
    private View previousView;

    public CalendarAdapter(Context c, GregorianCalendar monthCalendar) {
        CalendarAdapter.dayString = new ArrayList<String>();
         Locale.setDefault( Locale.US );
        month = monthCalendar;
        selectedDate = (GregorianCalendar) monthCalendar.clone();
        mContext = c;
        month.set(GregorianCalendar.DAY_OF_MONTH, 1);
        this.items = new ArrayList<String>();
        df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
        curentDateString = df.format(selectedDate.getTime());
        refreshDays();
    }

    public void setItems(ArrayList<String> items) {
        for (int i = 0; i != items.size(); i++) {
            if (items.get(i).length() == 1) {
                items.set(i, "0" + items.get(i));
            }
        }
        this.items = items;
    }

    public int getCount() {
        return dayString.size();
    }

    public Object getItem(int position) {
        return dayString.get(position);`enter code here`
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new view for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        TextView dayView;
        if (convertView == null) { // if it's not recycled, initialize some
                                    // attributes
            LayoutInflater vi = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.calendar_item, null);

        }
        dayView = (TextView) v.findViewById(R.id.date);
        // separates daystring into parts.
        String[] separatedTime = dayString.get(position).split("-");
        // taking last part of date. ie; 2 from 2012-12-02
        String gridvalue = separatedTime[2].replaceFirst("^0*", "");
        // checking whether the day is in current month or not.
        if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) {
            // setting offdays to white color.
            dayView.setTextColor(Color.WHITE);
            dayView.setClickable(false);
            dayView.setFocusable(false);
        } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) {
            dayView.setTextColor(Color.WHITE);
            dayView.setClickable(false);
            dayView.setFocusable(false);
        } else {
            // setting curent month's days in blue color.
            dayView.setTextColor(Color.BLUE);
        }

        if (dayString.get(position).equals(curentDateString)) {
            setSelected(v);
            previousView = v;
        } else {
            v.setBackgroundResource(R.drawable.list_item_background);
        }
        dayView.setText(gridvalue);

        // create date string for comparison
        String date = dayString.get(position);

        if (date.length() == 1) {
            date = "0" + date;
        }
        String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1);
        if (monthStr.length() == 1) {
            monthStr = "0" + monthStr;
        }

        // show icon if date is not empty and it exists in the items array
        ImageView iw = (ImageView) v.findViewById(R.id.date_icon);
        if (date.length() > 0 && items != null && items.contains(date)) {
            iw.setVisibility(View.VISIBLE);
        } else {
            iw.setVisibility(View.INVISIBLE);
        }
        return v;
    }

    public View setSelected(View view) {
        if (previousView != null) {
            previousView.setBackgroundResource(R.drawable.list_item_background);
        }
        previousView = view;
        view.setBackgroundResource(R.drawable.calendar_cel_selectl);
        return view;
    }

    public void refreshDays() {
        // clear items
        items.clear();
        dayString.clear();
        Locale.setDefault( Locale.US );
        pmonth = (GregorianCalendar) month.clone();
        // month start day. ie; sun, mon, etc
        firstDay = month.get(GregorianCalendar.DAY_OF_WEEK);
        // finding number of weeks in current month.
        maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH);
        // allocating maximum row number for the gridview.
        mnthlength = maxWeeknumber * 7;
        maxP = getMaxP(); // previous month maximum day 31,30....
        calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ...
        /**
         * Calendar instance for getting a complete gridview including the three
         * month's (previous,current,next) dates.
         */
        pmonthmaxset = (GregorianCalendar) pmonth.clone();
        /**
         * setting the start date as previous month's required date.
         */
        pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1);

        /**
         * filling calendar gridview.
         */
        for (int n = 0; n < mnthlength; n++) {

            itemvalue = df.format(pmonthmaxset.getTime());
            pmonthmaxset.add(GregorianCalendar.DATE, 1);
            dayString.add(itemvalue);

        }
    }

    private int getMaxP() {
        int maxP;
        if (month.get(GregorianCalendar.MONTH) == month
                .getActualMinimum(GregorianCalendar.MONTH)) {
            pmonth.set((month.get(GregorianCalendar.YEAR) - 1),
                    month.getActualMaximum(GregorianCalendar.MONTH), 1);
        } else {
            pmonth.set(GregorianCalendar.MONTH,
                    month.get(GregorianCalendar.MONTH) - 1);
        }
        maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);

        return maxP;
    }

}

package com.example.scheduler;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.provider.OpenableColumns;
import android.view.View;
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 CalendarView extends Activity {

    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

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar);
         Locale.setDefault( Locale.US );
        month = (GregorianCalendar) GregorianCalendar.getInstance();
        itemmonth = (GregorianCalendar) month.clone();

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

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

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

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

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

        previous.setOnClickListener(new OnClickListener() {

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

        RelativeLayout next = (RelativeLayout) 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);

            }
        });
    }

    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(this, string, Toast.LENGTH_SHORT).show();

    }

    public void refreshCalendar() {
        TextView title = (TextView) 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();
        }
    };




    }
package com.example.scheduler;
导入java.util.Calendar;
导入java.util.Date;
导入android.app.Activity;
导入android.app.DatePickerDialog;
导入android.app.Dialog;
导入android.app.TimePickerDialog;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.DatePicker;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.TimePicker;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
公共文本视图mDateDisplay;
公共按钮mPickDate;
私人髓鞘内;
私人住宅;
私人国际日;
私有文本视图mTimeDisplay;
专用按钮mPickTime;
私有按钮mSubmit;
私人住宅;
私家侦探;
私人日期;
公共编辑文本名称;
静态最终整数时间对话框ID=1;
静态最终整数日期对话框ID=0;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDateDisplay=(TextView)findViewById(R.id.date);
mPickDate=(按钮)findViewById(R.id.datepicker);
mTimeDisplay=(TextView)findViewById(R.id.time);
mPickTime=(按钮)findViewById(R.id.timepicker);
mName=(EditText)findViewById(R.id.name);
//拾取时间的单击事件侦听器
mPickTime.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
showDialog(时间对话框ID);
}
});
//PickDate的单击事件侦听器//
mPickDate.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
showDialog(日期对话框ID);
}
});
最终日历c=Calendar.getInstance();
mYear=c.get(日历年);
mMonth=c.get(日历月);
mDay=c.get(日历,月的第天);
mhour=c.get(日历小时);
mminute=c.get(日历分钟);
}
//更新日期//
私有void updateDate(){
mDateDisplay.setText(
新的StringBuilder()
//月份以0为基础,因此添加1
.append(mDay).append(“/”)
.append(mm+1)。append(“/”)
.append(mYear)。append(“”);
showDialog(时间对话框ID);
}
//更新时间//
public void updatetime()
{
mTimeDisplay.setText(
新的StringBuilder()
.append(pad(mhour)).append(“:”)
.附加(pad(mminute));
}
专用静态字符串填充(int c){
如果(c>=10)
返回字符串.valueOf(c);
其他的
返回“0”+字符串。valueOf(c);
}
//日期选择器对话框生成//
私有DatePickerDialog.OnDateSetListener MDataSetListener=
新建DatePickerDialog.OnDateSetListener(){
公共无效onDateSet(日期选择器视图,整数年,
int monthOfYear,int dayOfMonth){
迈耶=年;
Ammonth=蒙托夫年;
mDay=月的第几天;
updateDate();
}
};
//时间选择器对话框生成//
私有时间选择器Dialog.OnTimeSetListener MTTimeSetListener=
新的TimePickerDialog.OnTimeSetListener(){
时间集上的公共void(时间选择器视图,整数小时日,整数分钟){
mhour=小时/天;
mminute=分钟;
updatetime();
//意向意向=新意向(MainActivity.this、Alert.class);
//星触觉(意向);
字符串日期=mDateDisplay.getText().toString();
字符串时间=MTIMESPLAY.getText().toString();
String Name=mName.getText().toString();
意图intent1=新意图(MainActivity.this、Alert.class);
intent1.putExtra(“mDateDisplay”,日期);
intent1.putExtra(“mTimeDisplay”,时间);
intent1.putExtra(“mName”,名称);
星触觉(intent1);
}
};
@凌驾
受保护的对话框onCreateDialog(int id){
开关(id){
案例日期\u对话框\u ID:
返回新的DatePickerDialog(此,
mDateSetListener,
mYear,Ammonth,mDay);
案例时间\u对话框\u ID:
返回新的TimePickerDialog(此,
mTimeSetListener,mhour,mminute,false);
}
返回null;
}
}
下面是我的日历适配器和日历视图类:
包com.example.scheduler;
导入java.text.DateFormat;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.GregorianCalendar;
导入java.util.List;
导入java.util.Locale;
导入android.content.Context;
导入android.graphics.Color;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类CalendarAdapter扩展了BaseAdapter{
私有上下文;
private java.util.Calendar month;
public gregoriacalendar pmonth;//上个月的日历实例
/**
*卡尔
 if (dayString.get(position).equals(Your selected date)) {
            setSelected(v);
            previousView = v;
        } else {
            v.setBackgroundResource(R.drawable.list_item_background);
        }