Android 5.0(Lollipop)でDatePickerをスピナー型にする
Android 5.0(Lollipop)では、datePicker.setSpinnersShown(true)もdatePicker.setCalendarViewShown(false)も効きません。datePickerは強制的にカレンダ型になってしまいます。
スピナー型を選択する場合、旧テーマを選択することにより実現できます。
// 日付設定ダイアログの作成・リスナの登録
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), android.R.style.Theme_Holo_Dialog, DateSetListener, year, monthOfYear, dayOfMonth);
// 日付設定ダイアログの表示
datePickerDialog.show();
android.R.style.Theme_Holo_Dialogで、旧テーマを指定しています。
2017/9/4追記
Android 7.0以降では、この方法は通用しません。
数値をフォーマットする
- 金額の3桁毎にコンマを入れる。
textView.setText(String.format(Locale.JAPAN, "%,d", calculateBalance()));
- 数値のはじめを0でパディングする。
mNumber = (TextView) convertView.findViewById(R.id.textViewListNumber);
mNumber.setText(String.format(Locale.JAPAN, "%03d", position+1));
Spinner
Spinnerを使用してドロップダウンリストからアイテムを選択する。
- レイアウト
<Spinner
android:layout_width="200dp"
android:layout_height="wrap_content"
android:id="@+id/spinnerCategoly"
android:textAppearance="?android:attr/textAppearanceMedium" />
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// アイテムを追加します
SharedPreferences prefs = this.getActivity().getSharedPreferences("setting", Context.MODE_PRIVATE);
Context context = getActivity();
Resources res = context.getResources();
String category_1 = prefs.getString("Category_1", res.getString(R.string.category_default_1));
String category_2 = prefs.getString("Category_2", res.getString(R.string.category_default_2));
String category_3 = prefs.getString("Category_3", res.getString(R.string.category_default_3));
String category_4 = prefs.getString("Category_4", res.getString(R.string.category_default_4));
String category_5 = prefs.getString("Category_5", res.getString(R.string.category_default_5));
String category_6 = prefs.getString("Category_6", res.getString(R.string.category_default_6));
String category_7 = prefs.getString("Category_7", res.getString(R.string.category_default_7));
String category_8 = prefs.getString("Category_8", res.getString(R.string.category_default_8));
String category_9 = prefs.getString("Category_9", res.getString(R.string.category_default_9));
if (!category_1.equals("")) adapter.add(category_1);
if (!category_2.equals("")) adapter.add(category_2);
if (!category_3.equals("")) adapter.add(category_3);
if (!category_4.equals("")) adapter.add(category_4);
if (!category_5.equals("")) adapter.add(category_5);
if (!category_6.equals("")) adapter.add(category_6);
if (!category_7.equals("")) adapter.add(category_7);
if (!category_8.equals("")) adapter.add(category_8);
if (!category_9.equals("")) adapter.add(category_9);
Spinner spinner = (Spinner) view.findViewById(R.id.spinnerCategoly);
// アダプターを設定します
spinner.setAdapter(adapter);
// スピナーのアイテムが選択された時に呼び出されるコールバックリスナーを登録します
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Spinner spinner = (Spinner) parent;
// 選択されたアイテムを取得します
String item = (String) spinner.getSelectedItem();
dataCenter.setCurrentCategory(item);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
ポップアップウィンドウ(PopupWindow)
PopupWindowを表示して、EditTextでデータを入力する方法です。
まず、PopupWindowのレイアウトを決めます。
- category_setting_popup.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editTextCategorySettingPopUp"
android:inputType="text" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button_popup_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_alignParentLeft="true"
android:text="@string/button_register" />
<Button
android:id="@+id/button_popup_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_alignParentRight="true"
android:text="@string/button_cancel" />
</RelativeLayout>
</LinearLayout>
次にpopupを表示するソースコードです。
private class onClickCategory_1 implements View.OnClickListener {
public void onClick(View v) {
mPopupWindow = new PopupWindow(getActivity());
// レイアウト設定
final View popupView = getActivity().getLayoutInflater().inflate(R.layout.category_setting_popup, null);
popupView.findViewById(R.id.button_popup_register).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPopupWindow.isShowing()) {
EditText edText = (EditText) popupView.findViewById(R.id.editTextCategorySettingPopUp);
String category = edText.getText().toString();
Button button = (Button) getView().findViewById(R.id.buttonSettingCategory_1);
button.setText(category);
mPopupWindow.dismiss();
}
}
});
popupView.findViewById(R.id.button_popup_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
}
});
mPopupWindow.setContentView(popupView);
// タップ時に他のViewでキャッチされないための設定
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setFocusable(true);
// 表示サイズの設定 今回は幅200dp
float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics());
// mPopupWindow.setWindowLayoutMode((int) width, WindowManager.LayoutParams.WRAP_CONTENT);
mPopupWindow.setWidth((int) width);
mPopupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
// 画面(150, 300)に表示
mPopupWindow.showAtLocation(popupView.findViewById(R.id.button_popup_register), Gravity.NO_GRAVITY, 150, 300);
Button button = (Button) getView().findViewById(R.id.buttonSettingCategory_1);
String category = button.getText().toString();
if (category != null) {
EditText edText = (EditText) popupView.findViewById(R.id.editTextCategorySettingPopUp);
edText.setText(category);
}
}
}
Action ModeとToolbarのオーバーラップ
Toolbarを使っていると、コンテキストメニュのAction ModeとToolbarが二重で表示される事があります。
それを避けるため、style.xmlで、
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionModeOverlay">true</item>
</style>
の様にします。
<item name="windowActionModeOverlay">true</item>
で、Action ModeをToolbarにオーバーラップして表示させています。