móviles - manual de programacion android pdf
Calendario personalizado de Android (2)
Espero que esto te ayude, esto es todo el calendario personalizado editable que puedes editar a tu manera
tomar fragmento
public class fragmentCalender extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
ArrayList<calenderModelCustom> itemsArrayList = new ArrayList<>(); // calls function to get items list
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
private View mView;
private Context mContext;
private GridView mGridView;
private int temp = 1;
private calenderModelCustom mCalenderModelCustom;
private ImageButton mPreviousButton, mForwardButton;
private int mPageCount = 0;
private TextView mYearLable;
private int mYear;
private Calendar mCalender;
private int mCurrentDay, mCurrentMonth, mCurrentYear;
private ArrayList<calenderModelCustom> list;
private String mFirstDate;
public fragmentCalender() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment fragmentCalender.
*/
// TODO: Rename and change types and number of parameters
public static fragmentCalender newInstance(String param1, String param2) {
fragmentCalender fragment = new fragmentCalender();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.fragment_fragment_calender2, container, false);
mContext = this.getActivity();
Util.CAL_CUR_DATE_CNST = "0";
mCalender = Calendar.getInstance();
list = new ArrayList<>();
//initialize xml element object
initializeView();
//current things
setCurrentEnv(mCalender.get(Calendar.MONTH));
//current date
getDateTime();
//actions
initializeViewAction();
//set adapter
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
return mView;
}
/*
* setting first date,day of current month
* */
private void setCurrentEnv(int mCurrentMonth){
Log.i("<<>>Cal",String.valueOf(mCurrentMonth));
Date date = new Date();
date.setDate(1);
date.setMonth(mCurrentMonth);
date.setYear(mCurrentYear);
mFirstDate = getDay(date);
Log.i("<<>>Cal",mFirstDate);
if (mFirstDate.contains("Fri")) {
mPageCount = 4;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Sat")) {
mPageCount = 5;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Sunday")) {
mPageCount = 6;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Mon")) {
mPageCount = 0;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Tue")) {
mPageCount = 1;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Wed")) {
mPageCount = 2;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
} else if (mFirstDate.contains("Thu")) {
mPageCount = 3;
initializeViewAction();
initializeViewAdapter(mPageCount, Util.CAL_CUR_DATE_CNST);
}
}
private void initializeViewAction() {
if (mCurrentMonth == 1) {
mYearLable.setText("Jan " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 2) {
mYearLable.setText("Feb " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 3) {
mYearLable.setText("Mar " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 4) {
mYearLable.setText("Apr " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 5) {
mYearLable.setText("May " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 6) {
mYearLable.setText("Jun " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 7) {
mYearLable.setText("Jul " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 8) {
mYearLable.setText("Aug " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 9) {
mYearLable.setText("Sep " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 10) {
mYearLable.setText("Oct " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 11) {
mYearLable.setText("Nov " + String.valueOf(mCurrentYear));
} else if (mCurrentMonth == 12) {
mYearLable.setText("Dec " + String.valueOf(mCurrentYear));
} else {
mYearLable.setText("" + String.valueOf(mCurrentYear));
}
mForwardButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//increment current month by one
mCurrentMonth++;
//if current month >= 13 then start from first month
if (mCurrentMonth >= 13) {
mCurrentMonth = 1;
mCurrentYear ++;
}
setIfBackOrForwardToCurrentMonth();
setCurrentEnv(mCurrentMonth);
}
});
mPreviousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//increment current month by one
mCurrentMonth--;
//if current month >= 13 then start from first month
if (mCurrentMonth < 1) {
mCurrentMonth = 12;
mCurrentYear --;
}
setIfBackOrForwardToCurrentMonth();
setCurrentEnv(mCurrentMonth);
}
});
mGridView.setOnTouchListener(new OnSwipeTouchListener(mContext) {
public void onSwipeTop() {
Log.i("top","");
}
public void onSwipeRight() {
//increment current month by one
mCurrentMonth++;
//if current month >= 13 then start from first month
if (mCurrentMonth >= 13) {
mCurrentMonth = 1;
mCurrentYear ++;
}
setIfBackOrForwardToCurrentMonth();
setCurrentEnv(mCurrentMonth);
}
public void onSwipeLeft() {
//increment current month by one
mCurrentMonth--;
//if current month >= 13 then start from first month
if (mCurrentMonth < 1) {
mCurrentMonth = 12;
mCurrentYear --;
}
setIfBackOrForwardToCurrentMonth();
setCurrentEnv(mCurrentMonth);
}
public void onSwipeBottom() {
Log.i("bottom","");
}
});
}
/*
* parameter to set current date marker on calender
* */
private void setIfBackOrForwardToCurrentMonth() {
Log.i("<<>>Cal<>",mCurrentMonth+" "+Util.CURRENT_DATE);
if (mCurrentMonth==mCalender.get(Calendar.MONTH)+1){
Util.CAL_CUR_DATE_CNST = "0";
} if (mCurrentMonth!=mCalender.get(Calendar.MONTH)+1){
Util.CAL_CUR_DATE_CNST = "1";
}
}
/*method to get current date and store it separetely in variable*/
private String getDateTime() {
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = new Date();
mCurrentDay = mCalender.get(Calendar.DATE);
mCurrentMonth = mCalender.get(Calendar.MONTH)+1;
Util.CURRENT_DATE = String.valueOf(mCalender.get(Calendar.DATE));
Log.i("<<>>Cal<>",Util.CURRENT_DATE);
mCurrentYear = mCalender.get(Calendar.YEAR);
return dateFormat.format(date);
}
/*
* current day to print in text format
* */
public static String getDay(Date date) {
SimpleDateFormat simpleDateformat = new SimpleDateFormat("EEEE"); // the day of the week spelled out completely
System.out.println(simpleDateformat.format(date));
return simpleDateformat.format(date);
}
private void initializeViewAdapter(int temp , String mVisibility) {
CalenderAdapterView mCalenderAd = new CalenderAdapterView(mContext, generateItemsList(temp),Util.CURRENT_DATE,mVisibility);
mGridView.setAdapter(mCalenderAd);
}
private ArrayList<calenderModelCustom> generateItemsList(int temp) {
list.clear();
String itemNames[] = getResources().getStringArray(R.array.items_name);
for (int i = 0; i < temp; i++) {
list.add(new calenderModelCustom("", ""));
}
for (int i = 0; i < itemNames.length; i++) {
list.add(new calenderModelCustom(itemNames[i], itemNames[i]));
}
return list;
}
private void initializeView() {
mYearLable = (TextView) mView.findViewById(R.id.currentDateLabel);
mForwardButton = (ImageButton) mView.findViewById(R.id.btn_forward);
mPreviousButton = (ImageButton) mView.findViewById(R.id.btn_previous);
mGridView = (GridView) mView.findViewById(R.id.cal_grid_view);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
define la vista de cuadrícula en xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/marginRight"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.constraint.ConstraintLayout
android:id="@+id/calendarHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/btn_previous"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="85dp"
android:layout_height="0dp"
android:src="@drawable/ic_action_date_back"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/btn_forward"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="85dp"
android:layout_height="0dp"
android:src="@drawable/ic_action_date_next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/currentDateLabel"
android:layout_width="0dp"
android:layout_height="56dp"
android:gravity="center"
android:text=""
android:textSize="18sp"
app:layout_constraintLeft_toRightOf="@id/btn_previous"
app:layout_constraintRight_toLeftOf="@id/btn_forward"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<!-- eventDays header -->
<LinearLayout
android:id="@+id/calendar_header"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/calendarHeader"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/mondayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/monday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/tuesdayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/tuesday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/wednesdayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/wednesday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/thursdayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/thursday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/fridayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/friday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/saturdayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/saturday"
android:textColor="@color/daysLabelColor" />
<TextView
android:id="@+id/sundayLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="@string/sunday"
android:textColor="@color/daysLabelColor" />
</LinearLayout>
<GridView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="7"
android:gravity="center_vertical"
android:layout_below="@id/calendar_header"
android:id="@+id/cal_grid_view">
</GridView>
</RelativeLayout>
</android.support.v7.widget.CardView>
crear Util.class y escribir constantes
public static String CAL_CUR_DATE_CNST ;
public static String CURRENT_DATE ;
crear adaptador para la vista de cuadrícula
public class CalenderAdapterView extends BaseAdapter {
Calendar mCalender = Calendar.getInstance();
private Context context; //context
private ArrayList<calenderModelCustom> items; //data source of the list adapter
private String mCurrentDate;
private String mVisibility;
//public constructor
public CalenderAdapterView(Context context, ArrayList<calenderModelCustom> items, String currentDate, String mVisibility) {
this.context = context;
this.items = items;
this.mCurrentDate = currentDate;
this.mVisibility = mVisibility;
}
@Override
public int getCount() {
//returns total of items in the list
return items.size();
}
@Override
public Object getItem(int position) {
//returns list item at the specified position
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// inflate the layout for each list row
if (convertView == null) {
convertView = LayoutInflater.from(context).
inflate(R.layout.calendar_item, parent, false);
}
// get current item to be displayed
calenderModelCustom currentItem = (calenderModelCustom) getItem(position);
// get the TextView for item name and item description
TextView textViewItemName = (TextView)
convertView.findViewById(R.id.text_view_item_name);
ImageView mImageBaground = (ImageView)
convertView.findViewById(R.id.img_baground);
//sets the text for item name and item description from the current item object
textViewItemName.setText(currentItem.getmNoOfDays());
if (mVisibility.equals("0")) {
if (String.valueOf(mCalender.get(Calendar.DATE)).equals(currentItem.getmNoOfDays())) {
mImageBaground.setImageResource(R.drawable.circle_cur_date);
}
}
// returns the view for the current row
return convertView;
}
}
crear archivo xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:id="@+id/img_baground"/>
<TextView
android:id="@+id/text_view_item_name"
android:layout_width="match_parent"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:layout_centerVertical="true"
android:text="1"
android:layout_height="wrap_content" />
</RelativeLayout>
<TextView
android:id="@+id/text_view_item_description"
android:layout_width="match_parent"
android:gravity="center_horizontal"
android:layout_height="wrap_content" />
</LinearLayout>
y un archivo dibujable
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="30dp"
android:height="30dp"
/>
<stroke android:width="0.5dp"
android:color="@color/monsoon"/>
</shape>
y crear clase
public class calenderModelCustom {
private String mStartPos;
public String getmStartPos() {
return mStartPos;
}
public void setmStartPos(String mStartPos) {
this.mStartPos = mStartPos;
}
public String getmNoOfDays() {
return mNoOfDays;
}
public void setmNoOfDays(String mNoOfDays) {
this.mNoOfDays = mNoOfDays;
}
private String mNoOfDays;
public calenderModelCustom (String mStartPos,String mNoOfDays){
this.mStartPos = mStartPos;
this.mNoOfDays = mNoOfDays;
}
}
agregar en string.xml
<string name="monday">M</string>
<string name="tuesday">T</string>
<string name="wednesday">W</string>
<string name="thursday">T</string>
<string name="friday">F</string>
<string name="saturday">S</string>
<string name="sunday">S</string>
//calender
<string-array name="items_name">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
<item>11</item>
<item>12</item>
<item>13</item>
<item>14</item>
<item>15</item>
<item>16</item>
<item>17</item>
<item>18</item>
<item>19</item>
<item>20</item>
<item>21</item>
<item>22</item>
<item>23</item>
<item>24</item>
<item>25</item>
<item>26</item>
<item>27</item>
<item>28</item>
<item>29</item>
<item>30</item>
<item>31</item>
</string-array>
añadir dependencia para tarjeta
compile ''com.android.support:cardview-v7:26.1.0''
Anote el alcance de los chicos de implementación
Estoy buscando un CalendarView que se pueda usar en un diálogo como este:
Planeo usar android.widget.CalendarView
pero está disponible desde el nivel 11 de la API. Eso es un problema considerando que todavía hay muchos usuarios, usando Android 2.3.3 (pero ninguno importante puede dejar ir a ese conjunto de usuarios).
¿Cuál de estas opciones debo usar?
1) Las bibliotecas que están disponibles y las utilizan en consecuencia.
2) personalizar el android.widget.CalendarView
?
Si # 2, entonces ¿hay algún ejemplo para ello?
Hola visita todos los enlaces dados, espero que te ayude
1. https://github.com/inteist/android-better-time-picker
2. https://github.com/derekbrameyer/android-betterpickers
3. http://www.androiddevelopersolutions.com/2013/05/android-calendar-sync.html
4. http://www.androidviews.net/2013/04/extendedcalendarview/
5. http://abinashandroid.wordpress.com/2013/07/21/how-to-create-custom-calendar-in-android/
6. http://w2davids.wordpress.com/android-simple-calendar/
7. https://github.com/roomorama/Caldroid
8. https://github.com/flavienlaurent/datetimepicker
cuando vas a visitar
https://github.com/derekbrameyer/android-betterpickers
Para una implementación de trabajo de este proyecto vea la muestra / carpeta.
Implementar las devoluciones de llamada del controlador apropiado:
public class MyActivity extends Activity implements DatePickerDialogFragment.DatePickerDialogHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
}
@Override
public void onDialogDateSet(int year, int monthOfYear, int dayOfMonth) {
// Do something with your date!
}
}
Utilice una de las clases de Builder para crear un PickerDialog con un tema:
DatePickerBuilder dpb = new DatePickerBuilder()
.setFragmentManager(getSupportFragmentManager())
.setStyleResId(R.style.BetterPickersDialogFragment);
dpb.show();
También para otro ejemplo puedes visitar.
https://github.com/roomorama/Caldroid
y usar de la siguiente manera
Para insertar el fragmento de caldroid en su actividad, use el siguiente código:
CaldroidFragment caldroidFragment = new CaldroidFragment();
Bundle args = new Bundle();
Calendar cal = Calendar.getInstance();
args.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);
args.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));
caldroidFragment.setArguments(args);
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.calendar1, caldroidFragment);
t.commit();