{"id":20367916,"url":"https://github.com/ksoichiro/simplealertdialog-for-android","last_synced_at":"2025-06-10T11:06:02.761Z","repository":{"id":14030630,"uuid":"16732839","full_name":"ksoichiro/SimpleAlertDialog-for-Android","owner":"ksoichiro","description":"Library for Android DialogFragment.","archived":false,"fork":false,"pushed_at":"2021-08-17T05:23:53.000Z","size":2748,"stargazers_count":80,"open_issues_count":6,"forks_count":30,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-12T05:37:40.317Z","etag":null,"topics":["android","android-library","android-ui"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ksoichiro.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-02-11T14:14:29.000Z","updated_at":"2023-11-03T05:50:45.000Z","dependencies_parsed_at":"2022-08-31T08:42:11.361Z","dependency_job_id":null,"html_url":"https://github.com/ksoichiro/SimpleAlertDialog-for-Android","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksoichiro%2FSimpleAlertDialog-for-Android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksoichiro%2FSimpleAlertDialog-for-Android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksoichiro%2FSimpleAlertDialog-for-Android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksoichiro%2FSimpleAlertDialog-for-Android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ksoichiro","download_url":"https://codeload.github.com/ksoichiro/SimpleAlertDialog-for-Android/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ksoichiro%2FSimpleAlertDialog-for-Android/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259063440,"owners_count":22799713,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-library","android-ui"],"created_at":"2024-11-15T00:35:28.618Z","updated_at":"2025-06-10T11:06:02.630Z","avatar_url":"https://github.com/ksoichiro.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"SimpleAlertDialog for Android\n===\n\n[![Build Status](https://travis-ci.org/ksoichiro/SimpleAlertDialog-for-Android.svg?branch=master)](https://travis-ci.org/ksoichiro/SimpleAlertDialog-for-Android)\n[![Coverage Status](https://img.shields.io/coveralls/ksoichiro/SimpleAlertDialog-for-Android/master.svg)](https://coveralls.io/r/ksoichiro/SimpleAlertDialog-for-Android?branch=master)\n[![Maven Central](http://img.shields.io/maven-central/v/com.github.ksoichiro/simplealertdialog.svg)](https://github.com/ksoichiro/SimpleAlertDialog-for-Android/releases/latest)\n\nSimpleAlertDialogは、Androidアプリケーションで`DialogFragment`を`AlertDialog`のように簡単に扱えるようにするためのライブラリです。\n\n![Holo Dark](simplealertdialog-samples/images/screenshot_holo_dark.png \"Holo Dark style\")\n![Holo Light](simplealertdialog-samples/images/screenshot_holo_light.png \"Holo Light style\")\n![Custom](simplealertdialog-samples/images/screenshot_custom.png \"Custom style\")\n\n## 特徴\n\n* APIレベル4 (Android 1.6 Donut)からレベル19 (Android 4.4 KitKat) そして L で利用可能です。\n* Holoスタイルのダイアログを全てのバージョンで使えます。\n* `AlertDialog.Builder`のようにシンプルなインタフェースです。\n* 基本的なイベントをハンドリングするコールバックが用意してあります。\n* ダイアログのライフサイクルは、親となるActivityやFragmentと同期しているため、`IllegalStateException`に悩まされることはありません。\n* APIレベル11以上での通常の`Activity`と、android-support-v4ライブラリの`FragmentActivity`の両方をサポートしています。\n\n## インストール\n\n### Gradle\n\n```groovy\ndependencies {\n    compile 'com.github.ksoichiro:simplealertdialog:1.2.1@aar'\n}\n```\n\n### Eclipse ADT (ライブラリプロジェクトとしてインポート)\n\nsimplealertdialogフォルダがライブラリ本体です。\nEclipseやAndroid StudioなどのIDEでAndroid Library Projectとして取り込んでください。\n\n## 使用方法\n\n### メッセージとボタン\n\n![Message and a button](simplealertdialog-samples/images/screenshot_dialog1_message_button.png \"Message and a button\")\n\nメッセージとOKボタンだけのダイアログを表示するには、以下のようにします。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setMessage(\"Hello world!\")\n        .setPositiveButton(android.R.string.ok)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\n### ボタンのタップイベントのハンドリング\n\n![Handling button click](simplealertdialog-samples/images/screenshot_dialog2_buttons.png \"Handling button click\")\n\nボタンがタップされたイベントをハンドリングする場合は、以下のようにダイアログを表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setMessage(\"Hello world!\")\n        .setPositiveButton(android.R.string.ok)\n        .setNegativeButton(android.R.string.cancel)\n        .setRequestCode(1)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nActivityは、以下のように`SimpleAlertDialog.OnClickListener`インタフェースを実装させます。\n\n```java\npublic class NormalActivity extends Activity\n        implements SimpleAlertDialog.OnClickListener\n```\n\nそして、ハンドラーを定義します。\n\n```java\n@Override\npublic void onDialogPositiveButtonClicked(SimpleAlertDialog dialog,\n        int requestCode, View view) {\n    if (requestCode == 1) {\n        Toast.makeText(this, \"OK button clicked\", Toast.LENGTH_SHORT).show();\n    }\n}\n\n@Override\npublic void onDialogNegativeButtonClicked(SimpleAlertDialog dialog,\n        int requestCode, View view) {\n    if (requestCode == 1) {\n        Toast.makeText(this, \"Cancel button clicked\", Toast.LENGTH_SHORT).show();\n    }\n}\n```\n\n上記のリクエストコード(requestCode)を設定するのを忘れないでください。  \nひとつの`Actvity`や`Fragment`の中で複数の種類のダイアログを表示させる場合、同じコールバックメソッドを共用することになります。そこで、「リクエストコード」を設定してからダイアログを表示させ、コールバックでそのリクエストコードを渡すこと、どのダイアログによるイベントなのかを区別します。\n\n### ニュートラルボタン\n\n![Neutral button](simplealertdialog-samples/images/screenshot_dialog3_buttons_neutral.png \"Neutral button\")\n\n`AlertDialog.Builder`と同じように、OK、キャンセルの他にニュートラルボタンを設定する場合は以下のようにします。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setMessage(\"Hello world!\")\n        .setPositiveButton(android.R.string.ok)\n        .setNeutralButton(R.string.neutral)\n        .setNegativeButton(android.R.string.cancel)\n        .setRequestCode(1)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nニュートラルボタンのイベントをハンドリングするには、OK、キャンセルボタンの`SimpleAlertDialog.OnClickListener`とは別に、以下のように`SimpleAlertDialog.OnNeutralButtonClickListener`インタフェースを実装させます。\n\n```java\npublic class NormalActivity extends Activity\n        implements SimpleAlertDialog.OnNeutralButtonClickListener\n```\n\nそして、ハンドラーを定義します。\n\n```java\n@Override\npublic void onDialogNeutralButtonClicked(SimpleAlertDialog dialog, int requestCode, View view) {\n    if (requestCode == 1) {\n        Toast.makeText(this, \"Neutral button clicked\", Toast.LENGTH_SHORT).show();\n    }\n}\n```\n\n### リスト\n\n![リスト](simplealertdialog-samples/images/screenshot_dialog4_items.png \"リスト\")\n\nリストのダイアログは、以下のように表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Choose one\")\n        .setItems(R.array.single_choice)\n        .setRequestCode(REQUEST_CODE_ITEMS)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nインタフェースを実装します。\n\n```java\nimplements SimpleAlertDialog.OnItemClickListener\n```\n\nコールバックを実装します。\n\n```java\n@Override\npublic void onOnItemClick(final SimpleAlertDialog dialog, int requestCode,\n        int which) {\n    if (requestCode == REQUEST_CODE_ITEMS) {\n        // Do something\n    }\n}\n```\n\n### アイコンつきリスト\n\n![アイコンつきリスト](simplealertdialog-samples/images/screenshot_dialog5_items_with_icons.png \"アイコンつきリスト\")\n\nアイコンつきリストのダイアログは、以下のように表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Choose one\")\n        .setItems(R.array.icon_items, new int[]{\n                R.drawable.ic_action_aci_document3,\n                R.drawable.ic_action_aci_edit,\n                R.drawable.ic_action_aci_search})\n        .setRequestCode(REQUEST_CODE_ICON_ITEMS)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nコールバックはリストの場合と同様に`SimpleAlertDialog.OnItemClickListener`を使用します。\n\n### 単一選択リスト(Single choice list)\n\n![Single choice list](simplealertdialog-samples/images/screenshot_dialog6_singlechoice.png \"Single choice list\")\n\n単一選択リストのダイアログは、以下のように表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Choose one\")\n        .setSingleChoiceCheckedItem(0) // この設定で単一選択リストが有効になります\n        .setRequestCode(REQUEST_CODE_SINGLE_CHOICE_LIST)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nインタフェースを実装します。\n\n```java\nimplements SimpleAlertDialog.SingleChoiceArrayItemProvider\n```\n\nコールバックを実装します。\n\n```java\n@Override\npublic CharSequence[] onCreateSingleChoiceArray(final SimpleAlertDialog dialog, int requestCode) {\n    if (requestCode == REQUEST_CODE_SINGLE_CHOICE_LIST) {\n        return getResources().getTextArray(R.array.single_choice);\n    }\n    return null;\n}\n\n@Override\npublic void onSingleChoiceArrayItemClick(final SimpleAlertDialog dialog, int requestCode,\n        int position) {\n    if (requestCode == REQUEST_CODE_SINGLE_CHOICE_LIST) {\n        // Do something\n    }\n}\n```\n\n### カスタムアダプタ\n\n![Custom adapter](simplealertdialog-samples/images/screenshot_dialog7_adapter.png \"Custom adapter\")\n\nカスタマイズした`ListAdapter`を使ったダイアログは以下のように表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Choose your favorite\")\n        .setUseAdapter(true) // この設定でカスタムアダプタが有効になります\n        .setRequestCode(REQUEST_CODE_ADAPTER)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nインタフェースを実装します。\n\n```java\nimplements SimpleAlertDialog.ListProvider\n```\n\nコールバックを実装します。\n\n```java\n@Override\npublic ListAdapter onCreateList(SimpleAlertDialog dialog, int requestCode) {\n    if (requestCode == REQUEST_CODE_ADAPTER) {\n        // Create your custom adapter\n        return new SweetsAdapter(this, SWEETS_LIST);\n    }\n    return null;\n}\n\n@Override\npublic void onListItemClick(SimpleAlertDialog dialog, int requestCode, int position) {\n    if (requestCode == REQUEST_CODE_ADAPTER) {\n        // Do something\n    }\n}\n```\n\n### カスタムビュー\n\n![Custom view](simplealertdialog-samples/images/screenshot_dialog8_view.png \"Custom view\")\n\nカスタマイズしたビューを使ったダイアログは以下のように表示します。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Enter something\")\n        .setUseView(true) // この設定でカスタムビューが有効になります\n        .setRequestCode(REQUEST_CODE_VIEW)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\nインタフェースを実装します。\n\n```java\nimplements SimpleAlertDialog.ViewProvider\n```\n\nコールバックを実装します。\n\n```java\n@Override\npublic View onCreateView(SimpleAlertDialog dialog, int requestCode) {\n    if (requestCode == REQUEST_CODE_VIEW) {\n        final View view = LayoutInflater.from(this).inflate(R.layout.view_editor, null);\n        ((EditText) view.findViewById(R.id.text)).setText(\"Sample\");\n        return view;\n    }\n    return null;\n}\n```\n\n### EditText\n\n![EditText](simplealertdialog-samples/images/screenshot_dialog9_edittext.png \"EditText\")\n\n単純なEditTextのみのビューは、カスタムビューを用意しなくても以下で表示できます。\n\n```java\nnew SimpleAlertDialogFragment.Builder()\n        .setTitle(\"Enter something\")\n        .setEditText(\"Sample\", InputType.TYPE_CLASS_TEXT)\n        .setRequestCode(REQUEST_CODE_EDIT_TEXT)\n        .create().show(getFragmentManager(), \"dialog\");\n```\n\n## スタイルのカスタマイズ\n\nダイアログの画部分のUIをカスタマイズすることができます。  \n以下のように、アプリケーションのテーマに`simpleAlertDialogStyle`という要素を定義します。\n\n```xml\n\u003cstyle name=\"CustomTheme\" parent=\"CustomBaseTheme\"\u003e\n    \u003citem name=\"simpleAlertDialogStyle\"\u003e@style/SimpleAlertDialogStyle\u003c/item\u003e\n\u003c/style\u003e\n```\n\nこの要素で指定したスタイルの中に、以下のように詳細を定義します。\n\n```xml\n\u003cstyle name=\"SimpleAlertDialogStyle\" parent=\"@style/Theme.SimpleAlertDialog\"\u003e\n    \u003c!-- タイトルのセパレータのスタイル --\u003e\n    \u003citem name=\"sadTitleSeparatorBackground\"\u003e@drawable/title_separator\u003c/item\u003e\n    \u003citem name=\"sadTitleSeparatorHeight\"\u003e1dp\u003c/item\u003e\n    \u003c!-- タイトル部分のTextViewのスタイル --\u003e\n    \u003citem name=\"sadTitleTextStyle\"\u003e@style/SimpleAlertDialogTitleTextStyle\u003c/item\u003e\n    \u003c!-- メッセージ部分のTextViewのスタイル --\u003e\n    \u003citem name=\"sadMessageTextStyle\"\u003e@style/SimpleAlertDialogMessageTextStyle\u003c/item\u003e\n    \u003c!-- OK / キャンセル ボタン部分のTextViewのスタイル --\u003e\n    \u003citem name=\"sadButtonTextStyle\"\u003e@style/SimpleAlertDialogButtonTextStyle\u003c/item\u003e\n    \u003c!-- 単一選択リスト項目/リスト/アイコンつきリストのTextViewのスタイル --\u003e\n    \u003citem name=\"sadListItemTextStyle\"\u003e@style/SimpleAlertDialogListItemTextStyle\u003c/item\u003e\n    \u003c!-- 単一選択リスト項目のラジオボタンのDrawable --\u003e\n    \u003citem name=\"sadListChoiceIndicatorSingle\"\u003e@drawable/simpleblue_btn_radio\u003c/item\u003e\n\u003c/style\u003e\n```\n\n上記スタイルの`xxxTextStyle`は`TextAppearance`として反映されます。  \nつまり、例えば以下のように、通常の`TextView`の`TextAppearance`として様々なカスタマイズができます。\n\n```xml\n\u003cstyle name=\"SimpleAlertDialogTitleTextStyle\"\u003e\n    \u003citem name=\"android:textColor\"\u003e#FF99CC00\u003c/item\u003e\n    \u003citem name=\"android:fontFamily\"\u003esans-serif-light\u003c/item\u003e\n\u003c/style\u003e\n```\n\nHolo Lightスタイルを使用したい場合は、以下のようにスタイルの`parent`属性を`@style/Theme.SimpleAlertDialog.Light`として定義します。\n\n```xml\n\u003cstyle name=\"SimpleAlertDialogStyle\" parent=\"@style/Theme.SimpleAlertDialog.Light\"\u003e\n```\n\n## さらに詳しい使用方法と設計について\n\n### Fragmentと一緒に使う\n\nSimpleAlertDialogは、呼び出し元のFragmentを`getTargetFragment()`メソッドを使って取得します。  \nそのため、もしFragmentからSimpleAlertDialogのコールバックを受けたい場合は\n`setTargetFragment()`をBuilderによるダイアログ構築時に呼び出してください。\n\n```java\n        new SimpleAlertDialogSupportFragment.Builder()\n            // 以下によってSimpleAlertDialogはMyFragment\n            // が呼び出し元だと認識することができます\n            .setTargetFragment(MyFragment.this)\n            :\n```\n\n### なぜコールバックやパラメータ渡しのインタフェースを実装する必要があるのでしょうか？\n\nSimpleAlertDialogは`DialogFragment`の一種に過ぎないため、\n`Fragment`や`DialogFragment`の取り扱い方に従う必要があります。  \n`DialogFragment`はライフサイクルを持っており、`Activity`のライフサイクルとは異なります。\n\nそのため、カスタムビューやコールバックなどを直接渡してしまうと、アプリのクラッシュにつながってしまいます。\nActivityやFragmentはそれぞれ別のライフサイクルを持っており再生成されるため、ActivityとFragmentの参照関係が無効(`NullPointerException`など)になってしまったり、`Builder`で渡したオブジェクトが途中で`null`になり再生成できないことがあるためです。\n\nこの問題に対処するために、`Fragment`(`DialogFragment`)にはフィールドを持たせず、引数なしコンストラクタを定義し、`Fragment`へのすべてのパラメータは`Bundle`オブジェクトで取り扱う必要があります。\n\nこれらを考慮すると、SimpleAlertDialogはコールバック先を`getActivity`または`getTargetFragment`でアクセスできるオブジェクトだと仮定し、さらに特定のインタフェースを実装していたらコールバックする、という特定のインスタンスの参照関係に頼らない方法でコールバックするのがベストではないかと考えました。\n\nそのため、一見して非常に回りくどいインタフェースを多用する方法を採っています。\n\n## サンプル\n\n* ライブラリを使用したサンプルアプリケーションは、simplealertdialog-samplesフォルダに含まれています。\n* Google Playからダウンロードしてお試しいただけます。\n\n  [![Demo on Google Play](simplealertdialog-samples/images/en_generic_rgb_wo_60.png \"Banner\")](https://play.google.com/store/apps/details?id=com.simplealertdialog.sample.demos)\n\n\n## 開発者\n\n* Soichiro Kashima - \u003csoichiro.kashima@gmail.com\u003e\n\n\n## ライセンス\n\n    Copyright 2014 Soichiro Kashima\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n一部のDrawablesはAndroid Open Source Projectで作成されたものです。\n\n    Copyright (C) 2010 The Android Open Source Project\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\nこのライブラリはリリースに[chrisbanes/gradle-mvn-push](https://github.com/chrisbanes/gradle-mvn-push)を使用しています。\n\n    Copyright 2013 Chris Banes\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fksoichiro%2Fsimplealertdialog-for-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fksoichiro%2Fsimplealertdialog-for-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fksoichiro%2Fsimplealertdialog-for-android/lists"}