ããªãé·ãéããã©ã€ãã©ãªããšããã¬ãŒã ã¯ãŒã¯ãã®éããçè§£ã§ããŸããã§ããã ããããèªãã§ã°ãŒã°ã«ã§æ€çŽ¢ããããšã¯ã§ããŸãããããããã®æŠå¿µã®æå³ã¯çè§£ã§ããŸããã§ããã Androidåãã®ããã°ã©ãã³ã°ãéå§ããŠããããã°ã©ãã¯ã©ã€ãã©ãªã䜿çšããŸãããããã°ã©ãã¯ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãããšããèšèã®æå³ãããããçè§£ããŸããã
ãã®äžé£ã®èšäºã§ã¯ãAndroidåãã«éçºããéã«å¯ŸåŠããªããã°ãªããªãã£ãåé¡ã«ã€ããŠã話ããããšæããŸãã ç§ã®ç®æšã¯ããããã®åé¡ã«å¯Ÿããåªãããœãªã¥ãŒã·ã§ã³ãæäŸããããšã§ã¯ãªã
ã Android SDKã®
èæ¯ã䟵ã人ãã©ããªåé¡ã«ééããå¯èœæ§ãããããç¥ãããããšã§ãã å³ãã眲åè
ãèªåèªèº«ã§ã¢ã¡ãªã«ãçºèŠãããšã¯æããŸãããã圌ããèšãããã«ïŒãç¹°ãè¿ãã¯åŠç¿ã®æ¯ã§ããã

1. DatePickerDialogã®Dismissã¯OnDateSetListenerãã³ãã©ãŒãåŒã³åºããŸã
ç¶æ³
åå¿è
ã«ãšã£ãŠã¯éåžžã«äžå¿«ãªåé¡ã§ãã ç¹ã«ãSDKãæèšã®ããã«æ©èœããããšãæåŸ
ããŠããå Žåã
ãã€ãŠãç§ã¯ãããäœã§ããããçè§£ããããã«ãããããããªããã°ãªããŸããã§ããã ãã®åé¡ã¯ãæéãèšå®ããåŸãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŒãããã¯ããªãã£ããšããäºå®ã«ãã£ãŠæªåããŸããïŒæ°ããæéã¯ç»é¢ã«è¡šç€ºãããŸããã§ããïŒã ãã¹ãŠã®ããŒã¿ã¯ããã«ãªããžã§ã¯ãã«å
¥åãããããŒã¿ããŒã¹ã«ä¿åãããããã€ãã®ç»é¢ãèªã¿æ»ãããŸããã
ãããã°ãéå§ãããå Žæ-ãã£ã¹ãã¬ã€ç»é¢ããïŒæ¥ä»ã¯ãã¹ã
Date.nowïŒïŒã«äœ¿çšããããã-远å ã®æ¥ããããã
ãããããããïŒããã§ãŒã³ã«æ²¿ã£ãŠæ³åããã®ã¯ç°¡åã§ãã
解決ç
å®éããã®
ãã°ã¯ Lollipopã§
ä¿®æ£ãããŸãããã
èª°ãæ°ã«ããŸããïŒ
AppCompatã§ã¯ãGoogleã¯Google fixã远å ããäºå®ããªããããåé¿çãå¿
èŠã§ãã
ãããŠã圌ã¯ããã§ã -圌ã
ã¯ãã¡ã€ã«å
šäœãã³ããŒããŠããããéã³ãŸãã å®è£
æ
å ±ã¯
stackoverflowã§èŠã€ããããšãã§ããŸãã
DatePickerDialogFragment package net.davidcesarino.android.common.ui; import android.annotation.TargetApi; import android.app.Activity; import android.app.DatePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.Dialog; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.widget.DatePicker; public class DatePickerDialogFragment extends DialogFragment { public static final String YEAR = "Year"; public static final String MONTH = "Month"; public static final String DATE = "Day"; private OnDateSetListener mListener; @Override public void onAttach(Activity activity) { super.onAttach(activity); this.mListener = (OnDateSetListener) activity; } @Override public void onDetach() { this.mListener = null; super.onDetach(); } @TargetApi(11) @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Bundle b = getArguments(); int y = b.getInt(YEAR); int m = b.getInt(MONTH); int d = b.getInt(DATE);
2.ãã¿ã³ã䜿çšããã«ã¯ãããã«ã¯ãªãã¯ããå¿
èŠããããŸã
ç¶æ³
ãã¯ããã©ã®ããã«ïŒãã®ã«ããŽãªããã®å¥ã®ã±ãŒã¹ã éããŠãããã€ã¢ãã°ããã¯ã¹ã§ãè€æ°ã®
EditTextsã«ããŒã¿ãå
¥åãã[OK]ãã¯ãªãã¯ããç¶æ³ãæ³åããŠãã ããã äœãããããã®ã§ããããïŒ ããšãã°ã[OK]ãã¿ã³ã¯ã¯ãªãã¯ãç¡èŠã§ããŸãã ããããæåã®...ã ãã§ã¯ãªããåžžã«...
ãããŠæã«äžåºŠã ã.... ãããŠãã¡ããããããã°ãšãããã°ãšãããã°ãåã³å§ãŸããŸã...
解決ç
ãããŠã決å®ã¯éåžžã«ç°¡åã§ãã
setFocusableInTouchModeïŒïŒã®éæ³ãšãããäœã§ããããç¥ãå¿
èŠããããŸãã ç§ãã¡ã®å€ãã¯ã
ãã©ãŒã«ã¹å¯èœãªããããã£ã«ååãªæ³šæãæã£ãŠããŸããã 確ãã«ãããã¯ããèªäœã§æãããã倧éšåã¯æ¬æ¥ããã¹ãæ¯ãèããããŸãã ãããŠãããã§ç§ãã¡ã¯ã€ããŸããããŸãïŒ
- ãŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšããŠãŒã¶ãŒã¯ãã¿ã³ã«ãã©ãŒã«ã¹ãç§»åããŸãã
- ãŠãŒã¶ãŒãç»é¢ãã¯ãªãã¯ããããã©ã®èŠçŽ ãã¯ãªãã¯ããªãå Žå-ãã©ãŒã«ã¹ã¯ç»é¢ã«è»¢éãããŸããã€ãŸãããã©ãŒã«ã¹ã¯åæ£ããŸããã€ãŸãããã©ãŒã«ã¹ã¯ã¿ããã¢ãŒãã«ãªãããã©ãŒã«ã¹ã¢ãŒãããªãå Žåã«ãªããŸãã
ãã ïŒ ããã«ã¯ãåžžã«äŸå€ããããŸãã å Žåã«ãã£ãŠã¯ããã®ã¢ãŒãã§ãã©ãŒã«ã¹ãååšããå¯èœæ§ããããŸãïŒãããç¹°ãè¿ããŸãããããã©ãŒã«ã¹ãªãã¢ãŒãããšåŒã°ããŸãïŒã æãé¡èãªäŸã¯
EditTextã§ãã ãã®åäœã¯ãããŒããŒããš
EditTextã®åæå¯Ÿè©±ã«å¿
èŠã§ãã ããã§ãªããã°ãäœããæžãããšã¯æ©èœããŸããã
æçµçã«ããœãªã¥ãŒã·ã§ã³ã¯ãã¿ã³ã®
focusableInTouchMode = trueã§ãã ãœãªã¥ãŒã·ã§ã³ã¯ã·ã³ãã«ã«èŠããŸãããã©ãããå§ããã°ãããããããªããšãã¯ããã¹ãŠãç°ãªãè²ã«ãªããŸãã 詳现ã«ã€ããŠã¯
android-developers.blogspot.ruãã芧ãã ãã ã
3. Bundle.putParcelableïŒïŒ -åžžã«ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšã¯éããŸãã
ç¶æ³
ãã€ã¢ãã°ããã¯ã¹ããããã¢ã¯ãã£ããã£ããããŸãã 忢ãªåå¿ãšããŠã
VeryComplexModelã¯ã©ã¹ã®ãªããžã§ã¯ãããã€ã¢ãã°ããã¯ã¹ã«è»¢éããŠã¢ã¯ã·ã§ã³ïŒããšãã°ãç·šéïŒãå®è¡ãããããæ»ããŠæ°ããããŒãžã§ã³ãã¢ã¯ãã£ããã£ã®ããŒã¿ããŒã¹ã«ä¿åããããšã«ããŸãã
ãããŠåã³ãéæ³ã¯å¯Ÿè©±ãéãããšãã«èµ·ãããŸãã ãªããžã§ã¯ãã®ããŒã«ã«ã³ããŒã¯å€ããŸãŸã§ããããã«èŠããŸãããããã§ã¯ãããŸããã 圌女ã¯å€ãã£ãã
解決ç
Bundleã®ã¡ã«ããºã ã®èª€è§£ããã¹ãŠã§ãã ç§ã®çè§£ã§ã¯ã
Serialize ïŒïŒãš
deserializeïŒïŒãé£ç¶ã
ãŠè¡ãããå Žåã
Serializableããã³
JSONObjectã®ããã«ã
Bundleã¯åžžã«æåãããªããžã§ã¯ããäœæããŸãã ãããã«ãããç§ã¯ããæã£ãã ãã ããæé©åã®çç±ããŸãã¯ä»ã®äœããã®çç±ã§ã
ãã³ãã«ã¯ã·ãªã¢ã«åããã«ãªããžã§ã¯ããžã®ãã€ã³ã¿ãä¿æã§ããŸãã ãããã£ãŠã
åŽäžã«ãããããããã€ã¢ãã°å
ã®ããŒã¿ã®å€æŽã ã³ããŒã®ã¿ã被害ãåãããšäºæ³ãããŠããŸãããã
ãã以å€ã®å Žåã¯
Android SDKãæ³šæããŸããã4.ãã©ã°ã¡ã³ãå
ã®getFragmentManagerïŒïŒ
ç¶æ³
ãããããããã¯åå¿è
ïŒãããŠããã ãã§ã¯ãããŸããïŒïŒããã°ã©ããŒã®éã§æãäžè¬çãªåé¡ã§ãã å°ããªã©ãã¯ã¹ãã䟡å€ãããã1ã2æéã®ãããã°ãæäŸãããŸãã
FragmentManager㯠ãã¢ã¯ãã£ããã£å
ã®ãã©ã°ã¡ã³ãã管çãããããããã³ä»ã®ãã©ã°ã¡ã³ãå
ã®ãã¹ãããããã©ã°ã¡ã³ãã管çããããã«äœ¿çšãããŸãã
ã¢ã¯ãã£ããã£ã«ã¯
getFragmentManagerïŒïŒã¡ãœãããããããã©ã°ã¡ã³ãã«ã¯
getFragmentMangerïŒïŒã¡ãœããããããŸã-åŒã³åºãããã䜿çšããããæ©èœããŠããããŸãã¯ããã§ã¯ãªãïŒ..äœããåã³å£ããŸããã
SDKãæ®å¿µïŒè§£æ±ºç
æ®å¿µãªãããããã§ã¯2ã€ã®ããšãè£æã§ãã
- ã¢ã¯ãã£ããã£ãšãã©ã°ã¡ã³ããã»ãŒåãããã«åäœããããšãæåŸ
ãã
- RTFMååãç¡èŠãã
ããã¥ã¡ã³ããèŠããšããã©ã°ã¡ã³ãã®
getFragmentManagerïŒïŒ ã芪ã®
FragmentManagerãè¿ãããšãããã«ããããŸãã æåŸ
ã©ããã«åäœããéåžžã®ãã®ãååŸããã«ã¯ã
FragmentManagerã
getChildFragmentManagerïŒïŒã䜿çšããå¿
èŠããããŸãã
5.ã©ã³ã¿ã€ã ã§ã®Drawableã®å€æŽ
ç¶æ³
ããŸããŸãªãªããžã§ã¯ãã®ãã«ãã«ã©ãŒã®
èæ¯ãäœæããŠãããšãã«ããã®åé¡ã«çŽé¢ããŸããã ããã¯ãã£ããã®äŸã§æ³åã§ããŸãããã£ããã®äŸã§ã¯ãã¡ãã»ãŒãžã®ããã«ïŒã¡ãã»ãŒãžããã«ïŒãç°è²ã§ã察話è
ã®ããã«ãèµ€ã§æãããŠããŸãã
ãã¡ãããæãç°¡åãªè§£æ±ºçã¯ã2ã€ã®ç¬ç«ãããªãœãŒã¹ãäœæããããšã§ãã ããããããããäžåºŠã«ãããªãã®ããŒã ãããžã§ã¯ãã§ãããããªãã®ã¢ãŒãã£ã¹ãããã¬ãªãŒãã®ãããªãã®ã§ããå Žåã¯ã©ãã§ããããã ããã§ã¯ã
setColorFilterïŒïŒãšãã圢åŒã®ããŸããŸãªã¡ãœããã
圹ç«ã¡ãŸãã ããã§ããã
解決ç
yesã䜿çšããäžéšã®
R.drawable.bg_bubbleã« setColorFilterïŒïŒãé©çšããã ãã§ããããžã§ã¯ã
å
ã®é åã®ãã¹ãŠã®
bg_bubble ã«å€æŽãå ããããŸãã
å®éããŠãŒã¶ãŒã
bg_bubbleã§100åã®ã¡ãã»ãŒãžã衚瀺ãã
å Žå ãããã¯ãã®ãªãœãŒã¹ã®ã³ããŒã100åãããšããæå³ã§ã¯ãããŸããã æå³ããããŸããã æé©åã®ããã«ã1ã€ã®ã³ããŒã®ã¿ãä¿åããããããbg_
bubbleã®å€æŽã¯ãã¹ãŠã®ã¡ãã»ãŒãžã«äžåºŠã«åœ±é¿ããŸãã
æãç°¡åãªè§£æ±ºçã¯
ãããŒã«ã«ã³ããŒãäœæããããšã§ãã
Drawable clone = drawable.getConstantState().newDrawable();
åé¡ã®æ¬è³ªã¯
å¥ã®äŸã§ããã§ãã詳现ã«èª¬æãããŸãã
6.ããŸããŸãªãµã€ãº/ãã©ã³ãã«é¢ä¿ãªãã TextViewããTextViewãžã®é
眮
ãªã«ïŒ äœãããããªãã£ã ããã«èŠåŽããã«ããªã³ã¯ã¯ããã«
ããŒã¹ã©ã€ã³ã®é
眮ãèŠãã§ãã ãããŠ
2ã€ã§ãã
baselineã«ã€ããŠèšãããšã¯äœããããŸãããããããååšããããšãããã£ãŠããå Žåã®ã¿ã§ãã ããããããªããç¥ããªããªãã°...ãããŠæ¥œãã¿ã¯
ããã£ã³ã°ãšããŒãžã³ããå§ãŸã
ãŸã ã å人çã«ãç§ã¯ãããèŠãŸããã ãç£ãã§ããããã®ãããªã³ãŒããèšèªãšåŒã¶ããšãæ¢ããŠããªãã
7.ããã©ã«ãå€ã®ãªãã¹ãããŒ
ç¶æ³
ãæãè
ã«å¯Ÿããä¿è·ãããã³ãã®åœ¢ã§è¿œå ããå¿
èŠããã
ã¹ãããŒããããŸãããããã¯ã¹ãããŒèªäœã®äŸ¡å€ã§ã¯ãããŸããã
ããŒã«ãããä»ãã®ã¹ãã㌠Spinner.setPromptïŒïŒã¡ãœãããä»äºãããŠãããšæããããããŸãã
ããããã¯ãããŸããã§ãã ã ããã¯ãã€ã¢ãã°ã«å¯ŸããŠã®ã¿æ©èœããAndroidã®ãã¹ãŠã®ããŒãžã§ã³ã§ã¯è¡šç€ºãããŸããã ã©ãããïŒ
解決ç
ãäœããªãã äžç·ã«æ®ãããïŒcïŒAndroid SDKã
ãã€ãã®ããã«ãããã¯ãå¿
èŠã§ãã æåã«é ã«æµ®ãã¶ã®ã¯ã説æã®ããèŠçŽ ãé
åã®å
é ã«1ã€è¿œå ããããšã§ãã ããããããã¯æªã決æã§ãã ããã³ããã
ã¹ãããŒã®å€ãšããŠéžæã§ããããã«ãªã£ãã ãã§ãªãã
R.array /
CursorAdapterã䜿çšãããšãã«åé¡ãçºçããŸãã
ãããŠããã€ãã®ããã«ã
stackoverflowã®ãããã³ã°ã®æè¯ã®ãœãŒã¹ã§ãã
NothingSelectedSpinnerAdapter import android.content.Context; import android.database.DataSetObserver; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.SpinnerAdapter; public class NothingSelectedSpinnerAdapter implements SpinnerAdapter, ListAdapter { protected static final int EXTRA = 1; protected SpinnerAdapter adapter; protected Context context; protected int nothingSelectedLayout; protected int nothingSelectedDropdownLayout; protected LayoutInflater layoutInflater; public NothingSelectedSpinnerAdapter( SpinnerAdapter spinnerAdapter, int nothingSelectedLayout, Context context) { this(spinnerAdapter, nothingSelectedLayout, -1, context); } public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter, int nothingSelectedLayout, int nothingSelectedDropdownLayout, Context context) { this.adapter = spinnerAdapter; this.context = context; this.nothingSelectedLayout = nothingSelectedLayout; this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout; layoutInflater = LayoutInflater.from(context); } @Override public final View getView(int position, View convertView, ViewGroup parent) {
䜿çšäŸ Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setPrompt("Select your favorite Planet!"); spinner.setAdapter( new NothingSelectedSpinnerAdapter( adapter, R.layout.contact_spinner_row_nothing_selected,
8. SupportMapFragmentãšåŒã°ãããµãã
ç¶æ³
å¶ç¶ãã«ãŒããæ±ãå¿
èŠããããŸãã...幞ããªããšã«ãããã¯äžåºŠã ãã§ããããããã§ããã¹ãã¬ã¹ã®ããã«å°ãè£ãã髪ã
ã¯ããã«ã¯ååã§ããã
ãã€ãã®ããã«ãSDKã¯çµ¶å¯Ÿã«äžæ³šæã§ãããæèšã®ããã«æ©èœããããšãèæ
®ããŠãmem-faceãååŸããŸããã ãã®ç¬éãç§ã¯æè¿é
ä¿¡ããã
LeakCanaryãåãã§ã圌ã粟ç¥çã«è³è³ãããã°ãå匷ãå§ããŸããã 圌ãã¯å¥åŠã§ããïŒããšãã°ã
com.google.android.gms.location.internal.zzkãšããè¡ããããŸããïŒãã
MapFragmentããªãŒã¯ããŠãããšèšã£ãŠã
ãŸãã ã ãœãŒã¹ã³ãŒãã1æé以äžèª¿ã¹ãŠãæåŸã«äœãèŠã€ããŸãããïŒ ããŠãçãã¯ãã§ã«æããã ãšæããŸãã
å®éã«..
ãããå®éã«ã¯ã
SDKãšåœŒå¥³ãšã®ããªããºãã¯æçœªã§ãã ç§ã¯ééããåçœããŸããããã¯ããã«å¥åŠãªãã°ã«æ³šæãæã䟡å€ããããŸããããã©ããããããäžç·ã«æé·ããŸããã§ããã
LeakCanaryã®ãã°ã¯ããããªããã®ãªã³ã¯ãæ£ç¢ºã«è¡šç€ºãããæåŸã®è¡ãé€ããããŸãæç¢ºã§ã¯ãªãããšããããããŸãããããã£ãŠãä»ã®ãã¹ãŠã¯å®å
šã«ç¡èŠãããŸããã å人çã«ãç§ã¯æ¬¡ã®åé¡ã«ééããŸããã
- æŒã
- OutOfMemoryError No. 1
- OutOfMemoryError No. 2
- BadParcelableException
æåŸã®ãã°ã¯ç¹ã«äžå¿«ã§ããã
Parcelerã©ã€ãã©ãªãåããŠäœ¿çšãããšãã«ããã°ãå«ãŸããŠããããééã£ãŠäœ¿çšããŠãããšå€æããŸããã
SupportMapFragmentãåå ã§ãã°ãçºçãããšããèãã¯ãŸã£ããçããŸããã§ãããå人çã«
ãã³ãã«ã«ããŒã¿ã远å ããã³ãã«ãããšãã«çºçããã«ãŒããš
BadParcelableExceptionã«ã€ããŠã¯ã©ãã§ããããã ããã§ãç§ã¯åã³æ°æéãè²»ãããŠã
Parcelerãš
Bundle.putParcelableïŒïŒã®ãœãŒã¹ã³ãŒããéåžžèã«å匷ããŸããã
ãããã«
ããã«ãªã¹ããããŠãããã¹ãŠã®åé¡ãšå¥åŠãªç¹ãããã³èšäºã®äžè¬çãªããŒã³ã«ãããããããç§ã¯ãŸã ã¢ã³ããã€ãçšã«ããã°ã©ã ãããã§ãã ã¯ããSDKãé¡ãªã©ã«å¹³ææã¡ãäžããããšããããŸãããäžè¬ã«ãä»ã®å€ãã®ãååã«å®çŸãããïŒïŒïŒå¯èœæ§ãæäŸããŸãã æ°ãã
Toolbar ã
NavigationDrawerããã³
Behaviorã®äŸ¡å€ã¯äœã§ããïŒ
å
±æèŠçŽ ã¢ã¯ãã£ããã£ã®ç§»è¡ã«ã€ããŠã¯èšããŸã§ããããŸããïŒ
ãã®èšäºã§éæãããããšã¯1ã€ã ãã§ããåæ§ã®åé¡ã«ãŸã ééããŠããªãå Žåããããã«ééããããã«Googleã«ã¢ã¯ã»ã¹ãããããã°ã§1æéãé£äºãããŸããã§ããã ãæºãã®ãã2ã€ã®éšåãSDK +ã©ã€ãã©ãªãšRxJavaãäœæããäºå®ã§ããããã¡ããããã¹ãŠã¯ãã®éšåã®çµæã«äŸåããŸãã
åå¿è
ãäžè¬çãªããã°ã©ããŒã®
æ¹ã¯ãæãª
ãšãã«
CodePath Android Cliffnotesãèªãããšã匷ããå§ãããŸãã ããã¥ããããã«ã¯ãŸã£ãã圱é¿ããŸãããïŒãã¥ãããããªãå Žåã§ã¯ãããŸããïŒãSDKå
šäœã®éåžžã«è©³çްãªèª¬æãæäŸããŸãã