ともちゃんのアプリ開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA/Kotlin、iOSのSwiftUIを習得して行きます。ともちゃんの備忘録も兼ねています。

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以降では、この方法は通用しません。

 

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にオーバーラップして表示させています。

 

 

IMEが自動で出るのを防ぐ

EditTextにカーソルが移動すると、自動でIMEが出てしまうことがあります。

それを避けたい場合、

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

 

 のようにします。

こうすると、自分でEditTextをクリックしたときだけ、IMEが出ます。