rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ダイアログのOKボタンを押しても条件によってはダイアログを開いておく(AlertDialog , DialogFragment)

2021 Oct. 10.

出典 Android Dialog/AlertDialog getButton NullPointerException | Lua Software Code

概要

  • AlertDialogのgetButton()により、OKボタン、Cancelボタンのインスタンスを取得する

  • DialogFragmentのonStart()にokButton.setOnClickListener { }、cancelButton.setOnClickListener { }を組み込む


コード

class MyDialogFragment: DialogFragment() {
    // thank for https://code.luasoftware.com/tutorials/android/android-alertdialog-getbutton-null-pointer-exception/
    private val okButton: Button by lazy {
        (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE)
    }
    private val cancelButton: Button by lazy {
        (dialog as AlertDialog).getButton(AlertDialog.BUTTON_NEGATIVE)
    }

    override fun onStart() {
        super.onStart()
        okButton.setOnClickListener {
            if (!viewEtStr1.text.toString().isNullOrBlank() && !viewEtStr2.text.toString().isNullOrBlank()) {
                myDialog.dismiss()
            }
        }

        cancelButton.setOnClickListener {
            // do something
            myDialog.dismiss()
        }
    }
}

android開発 Dialogのデータを呼び出し元のActivityに渡す(独自リスナー利用)

2021 Oct. 17.
2021 Oct. 03.

出典 【Kotlin】DialogFragmentからActivityへ値を渡す - Qiita

手法

呼び出し元Activityにデータを渡す抽象メソッドを持つインターフェースをダイアログクラスに組み込む。
class MyDialogFragment: DialogFragment()  {

    public interface DialogListener{
        public fun onDialogPositive(dialog: DialogFragment)
        public fun onDialogNegative(dialog: DialogFragment)
        public fun onDialogMapReceive(dialog: DialogFragment, myMutableMap: MutableMap<String, String>) //Activity側へMutableMapを渡す
    }
}


呼び出し元のActivityにインターフェースを実装する。

ダイアログのOKボタンが押された時に実行する処理を、インターフェースの実装メソッドとして記述する。

class MainActivity : AppCompatActivity(), MyDialogFragment.DialogListener {
    override fun onDialogMapReceive(myDialog: DialogFragment, myMutableMap: MutableMap<String, String>) {
        //myDialogからの値を受け取り、defaultSharedPreferencesに保存する
        with ( defaultSharedPreferences.edit()) {
            putString("myData1", myMutableMap["myData1"])
            putString("myData2", myMutableMap["myData2"])
            apply()
        }
    }

    override fun onDialogPositive(myDialog: DialogFragment) {
        // 今回、実装なし
    }

    override fun onDialogNegative(myDialog: DialogFragment) {
        // キャンセル時。今回、実装なし
    }
}


呼び出し元Activityに実装したメソッドをダイアログクラスから呼び出せるようにする。

ダイアログクラスの生成時に呼ばれるonAttach()内で、インターフェースコンテクストを変数にセットする。
 listener = context as DialogListener

class SmbServerSettingDialogFragment: DialogFragment()  {

    var listener:DialogListener? = null

    // DialogListenerインターフェースコンテクストをlistenerにセットする
    //   MainActivityで実装したDialogListenerインターフェースのメソッドを利用できるようになる
    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            listener = context as DialogListener
        }catch (e: Exception){
            Log.e("MyApp","CANNOT FIND LISTENER")
        }
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}


ダイアログクラス内の、呼び出し元Activityにデータを渡すタイミングのところで、呼び出し元Activityに記述した実装メソッドを実行する。
class MyDialogFragment: DialogFragment()  {
    public interface DialogListener{
        public fun onDialogPositive(dialog: DialogFragment)
        public fun onDialogNegative(dialog: DialogFragment)
        public fun onDialogMapReceive(dialog: DialogFragment, myMutableMap: MutableMap<String, String>) //Activity側へMutableMapを渡す
    }

    var listener:DialogListener? = null

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        var mySettings: MutableMap<String, String> = mutableMapOf(
            "data1" to "",
            "data2" to ""
        )

        val builder = AlertDialog.Builder(activity)
        val inflater = requireActivity().layoutInflater
        val mySettingView = inflater.inflate(R.layout.dialog_my_setting, null)
        builder.setView(mySettingView)
            .setTitle("My Setting")
            .setPositiveButton("OK") { dialog, id ->
                    mySettings.put(
                        "data1",
                        mySettingView.findViewById<EditText>(R.id.data1).text.toString()
                    )
                    mySettings.put(
                        "data2",
                        mySettingView.findViewById<EditText>(R.id.data2).text.toString()
                    )

                // pass data to the Activity having called this dialog
                listener?.onDialogMapReceive(this, mySettings)

            }
            .setNegativeButton("Cancel") { dialog, id ->
                // nothing is done
            }
        return builder.create()
    }

    // DialogListenerインターフェースをlistenerにセットする
    //   MainActivityで実装したDialogListenerインターフェースのメソッドを利用できるようになる
    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            listener = context as DialogListener
        }catch (e: Exception){
            Log.e("MyApp","CANNOT FIND LISTENER")
        }
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

arch linux系 manjaro linux wifiを固定IP設定する

2021 Oct. 02.

出典 netctl - ArchWiki

netctlをインストール


暗号化wpaパスフレーズを対話形式で作成

 # cd /etc/netctl
 # wifi-menu -o
 /etc/netctl/wlp0s18f2u3-mywifiができる

/etc/netctl/wlp0s18f2u3-mywifi

Description='Automatically generated profile by wifi-menu'
Interface=wlp0s18f2u3    // "ip a"で表示される無線LANポート
Connection=wireless
Security=wpa
ESSID=mywifi
IP=static    // 固定IP設定
Key=\"encryptedkeystring


wifi設定ファイルを作成する

 # cp /etc/netctl/examples/wireless-wpa-static /etc/netctl/

wireless-wpa-static

Description='A simple WPA encrypted wireless connection using a static IP'
Interface=wlp0s18f2u3    // "ip a"で表示される無線LANポート
Connection=wireless
Security=wpa
ESSID='mywifi'
Key='encryptedkeystring'
IP=static    // 固定IP設定
Address='192.168.1.23/24'
Gateway='192.168.1.1'
DNS=('8.8.8.8' '192.168.1.1')
# Uncomment this if your ssid is hidden
#Hidden=yes


wifiクライアント機能起動

 # netctl start wireless-wpa-static
 # netctl enable wireless-wpa-static

設定変更反映

 # netctl reenable wireless-wpa-static

wifiクライアント機能再起動

 # netctl restart wireless-wpa-static

wifiクライアント機能停止

 # netctl stop wireless-wpa-static

manjaro linxu(arch linux系) netctlによる固定アドレスwifi設定でのDNS設定

2021 Oct. 02.

/etc/netctl/wireless-wpa-staticのDNS設定は、アドレスをカッコで囲む/囲まないのどちらも試したほうがよい。

DNS=('192.168.1.1')
DNS='192.168.1.1'
DNS=('8.8.8.8')
DNS='8.8.8.8'
DNS=('8.8.8.8' '192.168.1.1')
DNS=('192.168.1.1' '8.8.8.8')

/etc/netctl/wireless-wpa-static

Description='A simple WPA encrypted wireless connection using a static IP'
Interface=wlp0s18f2u3 
Connection=wireless
Security=wpa
ESSID='myhome'
#Key='mywirelesskey'
IP=static
Address='192.168.1.2/24'
Gateway='192.168.1.1'
DNS='8.8.8.8'


android開発 DefaultSharedPreferences Android 10(API level 29)以降での設定

2021 Sep. 26.

出典 sharedpreferences - PreferenceManager getDefaultSharedPreferences deprecated in Android Q - Stack Overflow

DefaultSharedPreferencesの利用は、Android 10(API level 29)以降は次の設定を要する


build.gradle(modle:app)

dependencies {
    def preference_version = "1.1.1"

   // 以下のJava設定もしくはKotlin設定のいずれかを記述する
    // Java language implementation
    implementation "androidx.preference:preference:$preference_version"
 
   // Kotlin
    implementation "androidx.preference:preference-ktx:$preference_version"
}

android開発 build.gradle(module:app) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"は不要

2021 Sep. 26.

出典 kotlin-stdlibの依存関係をgradleに書く必要はなくなりました - 縁側プログラミング

kotlin 1.4.0以降ではbuild.gradle(module:app)に次の設定は不要。

dependencies {
   implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

android開発 kotlin EditTextへの文字列のセットにはsetText()を使う

2021 Sep. 23.

EditTextへの文字列のセット

val str: String = "abc"
(NG) editTexr01.text = str  // 「EditableにStringを代入しようとしている」とのエラーになる
(OK) editTexr01.setText(str)