20210609のAndroidに関する記事は6件です。

FragmentのComposeエラー:ViewTreeLifecycleOwner not found from androidx.constraintlayout.widget.ConstraintLayout

背景 FragmentでJetpack Composeを使う時の書き方を以前書きましたが、Fragmentに対してComposeやろうとしたらエラーになったので、その備忘録 エラー時のgradle implementation 'androidx.appcompat:appcompat:1.2.0' エラー内容 Process: com.example.mapping_sample, PID: 15392 java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from androidx.constraintlayout.widget.ConstraintLayout{81a9941 V.E...... ......I. 0,0-0,0 #7f080076 app:id/container} at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:242) 解決したgradle implementation 'androidx.appcompat:appcompat:1.3.0' ここにはハマった・・・汗
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Studio layoutファイルと主なビュー

AndroidStudioでアプリを作ろうと勉強してることをまとめようと思います。 res/layoutファイルを編集する このレイアウトファイルを編集するための専用エディタをレイアウトエディタと呼びます。 レイアウトエディタの右上にボタン群があります。 コードタブを選択、コードモードにした状態で、XMLコードを記述していく。 →このXMLコードをAndroid Studioが解析してグラフィカルに表示してくれるのが、デザインタブ layoutファイルを理解する為にも、まずはXMlコードで記述していく。 主なレイアウト部品  タグ 内容 LinearLayout 一番扱いやすいレイアウト TableLayout 表形式で画面部品を配置 FlameLayout 画面部品を重ねて配置 RelativeLayout 画面部品を相対的に配置 ConstraintLayout RelativeLayout同様に、画面部品を相対的に配置 主な代表的なビュー  タグ 内容 TextView 文字列の表示 EditText テキストボックス(1行や複数行、数字のみなどの入力制限も可能) Button ボタン RadioButton ラジオボタン CheckBox チェックボックス SeekBar スライダー RatingBar ☆でレート値を表現 Switch ON/OFFが表現できるスイッチ 画面構成はタグの組み合わせ Androidの画面ではレイアウト部品とビュー部品を階層的に組み合わせて使います。 LineaLayout   ∟ TextView サンプルコード activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#A1A9BA" android:orientation="vertical"> <TextView android:id="@+id/tvLabelInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginBottom="10dp" android:background="#ffffff" android:text="@string/tv_msg" android:textSize="25sp" /> </LinearLayout> 解説 「android:id="@+id/tvLabelInput"」は、画面部品のID設定を指定している。 IDを指定することによって、アクティビティ内で、「@+id/・・・」 ・・・の名前で部品にアクセスできるようになる。 (私はjavaで言うところの変数だと思っています。) つまり、ここでは、「tvLabelInput」と言う名前でアクセスできるように設定している。 android:text="@string/tv_msg"は、画面部品が表示される時の文字列を設定します。 ファイル構成については、→ https://bit.ly/3g58tQH 基本的に文字列はstrings.xmlに記述し、そこからもらってくる。 その方法が「@string/・・・」 ・・・に、strings.xmlで宣言した、name=・・・ の・・・を指定する。  strings.xml <resources> <string name="app_name">画面部品サンプル</string> <string name="tv_msg">お名前を入力してください。</string> </resources> tips -入力の種類を設定する属性- 今回のサンプルコードでは出てきていないが、android:inputTypeについてまとめておきます。 値 内容 text 通常の文字列入力 number 数値の入力 phone 電話番号の入力 textEmailAddress メールアドレスの入力 textMultiLine 複数行の入力 textUri URIの入力 tips -数値の単位- 数値を指定する場合は、pxは使用しない。 理由は、画面密度に依存するから。Android端末ごとに画面密度が違うから不向き。 →dp、spを使う dpは、密度非依存ピクセルのこと。 密度が異なっていても、OSがサイズ計算をしてくれて、見た目が同じようになる。 spは、スケール非依存ピクセルのこと。 dpと似ているが、画面密度の違いだけでなく、ユーザーが設定した文字サイズも考慮している。 使い分け ビューやビューグループのサイズ設定には、dpを使用し、 テキストサイズの設定にはspを使用する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Studio 基礎 画面作成方法

AndroidStudioでアプリの画面作成方法の基礎をまとめようと思います。 レイアウトとは レイアウトとは、GUIの配置を決めるための仕組みです。 このレイアウトを使うことによって、Androidアプリの画面を簡単に作成することができます。 Android開発においては.xmlで記述してGUIを配置していきます。 レイアウトの種類 画面を構成する要素(パーツ)は大きくわけて2種類あります。 ビュー、(ウィジェットとも言う) ビューグループ(レイアウト部品とも言う) ビューは画面部品そのもののこと res/layoutファイルを編集する このレイアウトファイルを編集するための専用エディタをレイアウトエディタと呼びます。 レイアウトエディタの右上にボタン群があります。 コードタブを選択、コードモードにした状態で、XMLコードを記述していく。 →このXMLコードをAndroid Studioが解析してグラフィカルに表示してくれるのが、デザインタブ layoutファイルを理解する為にも、まずはXMlコードで記述していく。 主なレイアウト部品  タグ 内容 LinearLayout 一番扱いやすいレイアウト TableLayout 表形式で画面部品を配置 FlameLayout 画面部品を重ねて配置 RelativeLayout 画面部品を相対的に配置 ConstraintLayout RelativeLayout同様に、画面部品を相対的に配置 主な代表的なビュー  タグ 内容 TextView 文字列の表示 EditText テキストボックス(1行や複数行、数字のみなどの入力制限も可能) Button ボタン RadioButton ラジオボタン CheckBox チェックボックス SeekBar スライダー RatingBar ☆でレート値を表現 Switch ON/OFFが表現できるスイッチ 画面構成はタグの組み合わせ Androidの画面ではレイアウト部品とビュー部品を階層的に組み合わせて使います。 LineaLayout   ∟ TextView サンプルコード activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#A1A9BA" android:orientation="vertical"> <TextView android:id="@+id/tvLabelInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginBottom="10dp" android:background="#ffffff" android:text="@string/tv_msg" android:textSize="25sp" /> </LinearLayout> 解説 「android:id="@+id/tvLabelInput"」は、画面部品のID設定を指定している。 IDを指定することによって、アクティビティ内で、「@+id/・・・」 ・・・の名前で部品にアクセスできるようになる。 (私はjavaで言うところの変数だと思っています。) つまり、ここでは、「tvLabelInput」と言う名前でアクセスできるように設定している。 android:text="@string/tv_msg"は、画面部品が表示される時の文字列を設定します。 ファイル構成については、→ https://bit.ly/3g58tQH 基本的に文字列はstrings.xmlに記述し、そこからもらってくる。 その方法が「@string/・・・」 ・・・に、strings.xmlで宣言した、name=・・・ の・・・を指定する。  strings.xml <resources> <string name="app_name">画面部品サンプル</string> <string name="tv_msg">お名前を入力してください。</string> </resources> tips -入力の種類を設定する属性- 今回のサンプルコードでは出てきていないが、android:inputTypeについてまとめておきます。 値 内容 text 通常の文字列入力 number 数値の入力 phone 電話番号の入力 textEmailAddress メールアドレスの入力 textMultiLine 複数行の入力 textUri URIの入力 tips -数値の単位- 数値を指定する場合は、pxは使用しない。 理由は、画面密度に依存するから。Android端末ごとに画面密度が違うから不向き。 →dp、spを使う dpは、密度非依存ピクセルのこと。 密度が異なっていても、OSがサイズ計算をしてくれて、見た目が同じようになる。 spは、スケール非依存ピクセルのこと。 dpと似ているが、画面密度の違いだけでなく、ユーザーが設定した文字サイズも考慮している。 使い分け ビューやビューグループのサイズ設定には、dpを使用し、 テキストサイズの設定にはspを使用する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Kotlin研修6日目】フラグメントを用いたマルチデバイス対応、フラグメント間の値渡し

フラグメントを用いたマルチデバイスへの対応 フラグメントを用いてアプリをマルチデバイス対応にする手順は、以下の通り。 res/layout/activity_mainフォルダに、画面サイズに応じたレイアウトファイル(=Android Resource File)を作成※Android Resource File生成時に自動的に配置される 1.で作成したレイアウトファイルにXML情報を記述 最初に表示されるフラグメントファイルに、画面サイズの判定を行う変数を定義 3.で定義した変数の値に応じた分岐処理を、各フラグメントファイルに記述 layoutの設定修飾子 参考1: アプリリリースの概要(表2.) 参考2: 各種の画面サイズのサポート(図4.) layout-<設定修飾子>の順番で命名する。 設定修飾子が複数ある場合、以下の表の上から順に-(ハイフン)で区切る。 分類 設定修飾子 内容 画面サイズ small 低密度QVGA320x426[dp]~ 画面サイズ normal 中密度HVGA320x470[dp]~ 画面サイズ large 中密度VGA480x640[dp]~ 画面サイズ xlarge 中密度HVGA以上720x960[dp]~ 画面アスペクト long Wの付く幅が長い画面 画面アスペクト long Wの付かない幅が長くない画面 画面の向き port 垂直方向 画面の向き land 水平方向 画面サイズに応じた分岐処理 メインフラグメント(必ず表示) MenuListFragment.kt(Main) class MenuListFragment: Fragment() { // 10-inchの画面かどうか判定するフラグ private var _isLayoutXLarge = true ... override fun onActivityCreated(savedInstanceState: Bundle?) { ... // アクティビティ内のFrameLayout(View)を取得 val menuThanksFrame = activity?.findViewById<View>(R.id.menuThanksFrame) // 指定したView(FrameLayout)が同一アクティビティ内に存在しない場合 // -> 10-inchでない場合 if (menuThanksFrame == null) { _isLayoutXLarge = false } } // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ) private inner class ListItemClickListener: AdapterView.OnItemClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // 10-inchの画面である場合 if (_isLayoutXLarge) { ... // フラグメントトランザクション(後述) } // 10-inchの画面でない場合 else { ... // 画面遷移 } } } } サブフラグメント(大画面の場合は右半分に表示) MenuThanksFragment.kt(Sub) class MenuThanksFragment: Fragment() { // 10-inchの画面かどうか判定するフラグ private var _isLayoutXLarger = true override fun onCreate(savedInstanceState: Bundle?) { ... // 10-inchの判定を行うためのフラグメント // fragmentManager: FragmentManagerオブジェクトを表すプロパティ // FragmentManager: アクティビティが保有するフラグメントを管理するクラス // FragmentManager.findFragmentById(Id:): 指定したID(R値)に一致するフラグメントの取得 // id: レイアウトファイル(XML)で記述したフラグメントのID(R値) val menuListFragment = fragmentManager?.findFragmentById(R.id.fragmentMenuList) // 指定したフラグメントが同一アクティビティ内に存在しない場合 // -> 10-inchでない場合 if (menuListFragment == null) { _isLayoutXLarger = false } } // フラグメントのレイアウト(XML)のインフレート(フラグメントの生成) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // 10-inchの画面である場合(=同一アクティビティ内) if (_isLayoutXLarger) { ... // Bundleオブジェクト(argumentsプロパティ)を通じてデータ取得 } // 10-inchの画面でない場合(=別のアクティビティ) else { ... // Intentオブジェクトを通じてデータ取得 } } FragmentManager 参考: フラグメントマネージャー アクティビティが保有するフラグメントを管理するクラス。 フラグメント間の画面遷移とフラグメントトランザクション 画面遷移を実装する場合は、Intentオブジェクトを利用する。 フラグメントトランザクションを実装する場合は、FragmentManagerとFragmentTransaction(後述)を利用する。 画面遷移 参考: 研修3日目 Fragmentクラスは、Intentが継承するActivityクラスを継承していないため、 Activity(を継承する)オブジェクトを利用する際は、 FragmentActivityクラスのactivityプロパティ(Nullable型)を用いる。 サンプルコード MenuListFragment.kt(遷移元) class MenuListFragment : Fragment() { ... // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ) private inner class ListItemClickListener: AdapterView.OnItemClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onItemClick( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { // 遷移元と遷移先を紐づけるIntentオブジェクトの生成 // -> フラグメントのアクティビティオブジェクトは`activity`プロパティで表される val intent2MenuThanks = Intent(activity, MenuThanksActivity::class.java) // 遷移先アクティビティの起動 startActivity(intent2MenuThanks) } } } MenuThanksFragment.kt(遷移先) class MenuThanksFragment : Fragment() { ... // "タップ"イベントを検知するするリスナクラス(リスナ) private inner class ButtonClickListener: View.OnClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onClick(view: View?) { // アクティビティの終了 // -> activityプロパティを中継してfinish()メソッドを利用 activity?.finish() } } } フラグメントトランザクション 参考: フラグメントトランザクション FragmentManagerによって管理されるフラグメントの追加・削除など、 フラグメントに関する複数の処理をグループ化した1つの処理。 FragmentTransactionクラス フラグメントトランザクションを制御するクラス。 FragmentTransactionオブジェクトの取得 フラグメントトランザクションを制御するのはFragmentTransactionクラスであるが、 フラグメントを管理するのはFragmentManagerであるため、 FragmentManagerにあたるFragmentクラスのfragmentManagerプロパティを利用する。 定義 FragmentManager?.beginTransaction() 編集するフラグメントの定義 // 新規追加する場合 val newFragment = newFragment() // 他のフラグメントを指定する場合 val editedFragment = FragmentManager?.findFragmentById(R.id.fragmentMenuList) // 自身のフラグメントを指定する場合 // -> 記述不要 フラグメントトランザクションの編集 フラグメントの追加 FragmentTransaction?.add( containerViewId: Int, fragment: Fragment! ): FragmentTransaction! // パラメータ // containerViewId: 追加先のレイアウト部品のID(R値) // fragment: 追加するフラグメントオブジェクト フラグメントの置換 FragmentTransaction?.replace( containerViewId: Int, fragment: Fragment! ): FragmentTransaction! // パラメータ // containerViewId: 置換先のレイアウト部品のID(R値) // fragment: 置換するフラグメントオブジェクト フラグメントの削除 FragmentTransaction?.remove( fragment: Fragment! ): FragmentTransaction! // パラメータ // fragment: 削除するフラグメントオブジェクト 編集したフラグメントトランザクションの反映(コミット) 定義 FragmentTransaction?.commit() サンプルコード フラグメントの新規追加 MenuListFragment.kt class MenuListFragment : Fragment() { ... // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ) private inner class ListItemClickListener: AdapterView.OnItemClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // フラグメントトランザクションの編集開始 val transaction = fragmentManager?.beginTransaction() // 追加するフラグメントオブジェクトの生成 val menuThanksFragment = MenuThanksFragment() // フラグメントの置換 transaction?.replace(R.id.menuThanksFrame, menuThanksFragment) // 編集したフラグメントトランザクションを反映(コミット) transaction?.commit() } } } 追加したフラグメントの削除 MenuThanksFragment.kt class MenuThanksFragment : Fragment() { ... // "タップ"イベントを検知するするリスナクラス(リスナ) private inner class ButtonClickListener: View.OnClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onClick(view: View?) { // フラグメントトランザクションの編集開始 val transaction = fragmentManager?.beginTransaction() // フラグメントの削除 transaction?.remove(this@MenuThanksFragment) // 編集したフラグメントトランザクションを反映(コミット) transaction?.commit() } } } フラグメントトランザクションにおけるフラグメント間の値渡し 追加するフラグメントのBundle型であるargumentsプロパティを利用して値を渡す。 遷移元フラグメントでは、IntentオブジェクトがもつBundleオブジェクトに直接データを格納する。 遷移先フラグメントでは、Bundleオブジェクトのデータを、 Fragmentクラスのargumentプロパティを用いてデータを取得する。 Bundle 参考: Bundle キーと値を格納したMap<String, Any>型のデータ構造をもつコレクション。 このデータ構造を用いて、各種データに名前を付けて管理することができる。 Bundleを用いたインテントへのデータ格納 サンプルコード MenuListFragment.kt(追加元) class MenuListFragment: Fragment() { ... // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ) private inner class ListItemClickListener: AdapterView.OnItemClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { ... // Bundleオブジェクトの生成 val bundle = Bundle() // Bundleオブジェクトへのデータ格納 bundle.putString("menuName", menuName) bundle.putString("menuPrice", menuPrice) ... // 遷移先フラグメントオブジェクトの生成 val menuThanksFragment = MenuThanksFragment() // 遷移先オブジェクトのargumentsプロパティにBundleオブジェクトを代入 // -> 遷移先ではargumentsプロパティを用いてデータを取得 menuThanksFragment.arguments = bundle } } } Bundleを用いたインテントからのデータ取得 サンプルコード MenuThanksFragment.kt(追加先) class MenuThanksFragment: Fragment() { // フラグメントのレイアウト(XML)のインフレート(フラグメントの生成) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { ... // データが格納されるBundleオブジェクト // -> 画面サイズに応じた分岐処理を行えるよう初期化せず定義 val extras: Bundle? // Bundleオブジェクトにデータを格納 // arguments: データが格納されたBundleオブジェクト // <- 追加元でargumentsプロパティにデータを格納済み extras = arguments // キーを指定して値を取得 val menuName = extras?.getString("menuName") val menuPrice = extras?.getString("menuPrice") ... } 画面遷移におけるフラグメント間の値渡し 参考: 研修3日目 Intentオブジェクトを利用して値を渡す。 BundleはIntentクラスを、IntentはActivityクラスを継承しているものの、 FragmentはActivityクラスを継承していないため、 フラグメントでこれらのオブジェクトを利用する場合は、 フラグメントのactivityプロパティ(Nullable型)を利用する。 サンプルコード MenuListFragment.kt(遷移元) class MenuListFragment : Fragment() { ... // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ) private inner class ListItemClickListener: AdapterView.OnItemClickListener { // "タップ"イベント検知時の処理(イベントハンドラ) override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // Bundleオブジェクトの生成 val bundle = Bundle() // Bundleオブジェクトへのデータ格納 bundle.putString("menuName", menuName) bundle.putString("menuPrice", menuPrice) // 画面遷移を実現するIntentオブジェクトの生成 // -> FragmentクラスはActivityクラスを継承していないため、 Fragment.activityプロパティを指定 val intent2MenuThanks = Intent(activity, MenuThanksActivity::class.java) // Bundleオブジェクトへのデータの格納 intent2MenuThanks.putExtras(bundle) ... } } } MenuThanksFragment.kt(遷移先) class MenuThanksFragment: Fragment() { // フラグメントのレイアウト(XML)のインフレート(フラグメントの生成) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { ... // データが格納されるBundleオブジェクト // -> 画面サイズに応じた分岐処理を行えるよう初期化せず定義 val extras: Bundle? // 遷移元と遷移先を紐づけるIntentオブジェクト // -> FragmentクラスはActivityクラスを継承していないため、 // activityプロパティ(Nullable型)を中継してintentプロパティを利用 // intent: Intentオブジェクト(Activityクラスのプロパティ) val intent = activity?.intent // データが格納されたBundleオブジェクト // extras: Intentオブジェクトに格納されたキーと値を格納するBundleオブジェクト extras = intent?.extras } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Android】DFMをローカルで試す

こんにちは。 DFMを実装した時に毎回GooglePlayのInternalAppSharingにアプリをアップロードして試していたのですが、 デバッグができないことや毎回apkやaabをアップロードする手間が発生して大変でした。 さすがに大変だったのでローカルでできる方法はないかと思い、調べていたところ公式でやり方が書いてあったのでここにまとめておきます。 準備しておくこと bundletoolを使えるようにしておく 公式ページ brew install bundletool でもできます aabを用意しておく ./gradlew bundleDebug 等で作成 やり方 1. aabをapksに変換 bundletoolを使ってaabをapksに変換します。 以下コマンドをコマンドライン上で実行します。 bundletool build-apks --local-testing --bundle my_app.aab --output my_app.apks これが成功するとoutputで指定した名前のapksが作成されます。 余談 apksは実態がzipなのでunzipできます。 unzipしてみると中にapkが複数入ってます。 気になる方は見てみてください。 2. apksをインストール 次に、apksを端末にインストールします。 これもbundletoolを使ってやっていきます。 すでにアプリがインストールされている場合はアンインストールしておきましょう。 以下コマンドを実行します。 bundletool install-apks --apks my_app.apks 3. アプリを実行 インストールがうまくいったらいよいよアプリを起動してみましょう。 アプリでDFMをインストールするフローに行くとしっかりインストールされることが確認できると思います。 以上がやり方になります。 最後に 意外と簡単にローカルで試すことができました。 また、やり方では説明していませんでしたが、SplitInstallManagerをFakeSplitInstallManagerというものに置き換えると通信エラーなどの状態も再現することができるので気になる方はぜひそちらも試してみてください。 参考ページ https://developer.android.com/guide/app-bundle/test/testing-fakesplitinstallmanager?hl=ja
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Androidで動くLinux環境

概要 android端末上で動かすことができるLinux環境について軽く説明します 日本語化などの設定方法は今回は見送ります。 候補 android上で動かすことができるLinux環境としては主に以下があります。 Termux ubuntu-in-termux UserLAnd どれもRoot化は不要なので簡単に試すことができます。 それぞれについて特徴を解説しますが、結論を先に言ってしまえば、個人的なおすすめはUserLAndのUbuntuです。 Termux Google PlayおよびF-Droidからインストールできます。 Google Play https://play.google.com/store/apps/details?id=com.termux F-Droid https://f-droid.org/packages/com.termux/ F-Droidの方が新しいようなので、F-Droid版の方がおすすめです。 特徴・良い点 ストアから簡単インストール可能 他の選択肢にくらべて動作が速い(chrootに似た仕組みであるprootを使っていないため) 基本的に端末のみ 専用Widgetなどが用意されている 残念な点 パッケージが少ない 特にmozcなどの日本語入力パッケージがない Emacs上でskkによる日本語入力が可能 ディレクトリ構成が通常のLinuxディストリビューションとは大きく異なる prootを使っていないためなので、速さの代償 GUI環境が必要な場合は、別途XServerやVNCなどを立ち上げるなど手間が必要 ubuntu-in-termux termux上で、さらにubuntuを立ち上げることが可能 https://github.com/MFDGaming/ubuntu-in-termux セットアップが済んだあとは、termuxを立ち上げたあと、startubuntu.shを実行する 特徴・良い点 ubuntuのパッケージ群が利用できる mozcなどの日本語入力用のパッケージもある ディレクトリ構成が通常のLinuxと近い 残念な点 prootベースなのでtermuxよりも動作が遅い GUIについてはtermuxと同様、別途XServerやVNCの立ち上げが必要 termuxを立ち上げたあとに、startubuntu.shを実行するので一手間入る UserLAnd Google PlayおよびF-Droidからインストールできます。 google play https://play.google.com/store/apps/details?id=tech.ula F-Droid https://f-droid.org/packages/tech.ula/ 特徴・良い点 UbuntuやDebianなどアプリ画面から選択して使うことができる それぞれのディストリビューションのパッケージが使える 日本語入力系のパッケージもあれば使える ワンタッチでデスクトップ環境が立ち上がる android上のVNCアプリや、XServerアプリを立ち上げてくれる Linux側でVNCサーバーの立ち上げや、デスクトップ環境の立ち上げもできる ディレクトリ構成は通常のLinuxと近い 残念な点 prootベースなのでtermuxよりも動作が遅い 毎回パスワードが求められる 端末モードでの最初のパスワードはスキップするには改造が必要。 GUIはスマホの画面ではあまり現実的でない タブレットにするか、PCからVNCでつなぐかになると思う まとめ Termux 日本語入力がいらない or Emacs+SKKで大丈夫なら選択肢になる ubuntu-in-termux 基本Termuxだけど、緊急で日本語入力したい場合に良いかもしれない UserLAnd 最初からUbuntuが立ち上がるのが楽 ちょっとした用途なら遅さはそれほど気にならない
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む