Android
 Computer >> コンピューター >  >> システム >> Android

Android ナビゲーション コンポーネントを構築する方法

アプリケーションの設計は煩雑になる傾向があり、多くの場合、さまざまな点から他の点を指す矢印が付いたホワイトボードがあります。

最初は 1 つまたは 2 つのアクティビティを持つアプリケーションだと思っていたものが、突然、複数のフロー、フラグメント、および幅広いユーザー インタラクションを持っているように見えます。そのホワイトボードに書かれていることをコードで簡単に再現できたらいいと思いませんか?

ナビゲーション コンポーネントにようこそ。

なじみのない人には、ナビゲーション コンポーネントは、アクティビティ/フラグメントのレイアウトの代わりに配置する別の UI クラスではありません。大陸の代わりに断片があり、方向が必要な地図のようなものだと考えてください。 大陸から大陸へと移動します。フラグメントとそれらの間の接続をトップダウン方式で提示します。この記事では、このコンポーネントの主な側面を説明し、アプリケーションに統合する方法を学びます。

出航する準備はできましたか? ⛵️

コツを学ぶ

Navigation コンポーネントは、Android Studio 3.3 以降で利用できます。使用するには、次の依存関係をプロジェクトに追加してください:

android {
    ...
}

dependencies {
    implementation 'androidx.navigation:navigation-fragment-ktx:2.0.0'
    implementation 'androidx.navigation:navigation-ui-ktx:2.0.0'
}

何かを操作するために、次の構造を持つアプリケーションを設計したとします:

  • フラグメントを開始
  • フラグメントA
  • フラグメント B

ユーザーは、開始フラグメントからフラグメント A またはフラグメント B に移動できます。

Android ナビゲーション コンポーネントを構築する方法
私たちのアプリケーション

これらすべてをナビゲーション コンポーネントなしで行いたい場合は、ボタンの 1 つがクリックされたときにフラグメントを開くという非常によく知られたコードを追加する必要があります。

val myFragment : MyFragment = MyFragment()
supportFragmentManager.beginTransaction().add(R.id.container, myFragment).commit()

私たちの小さな例では、これはいくつかの短い行に相当し、かなり複雑ではありませんが、アプリケーションがより大きく、より複雑なユーザー フローを持っている場合、これが適切にスケーリングされないことに誰もが同意できると思います.

出発です

Navigation コンポーネントの使用を開始するには、ナビゲーション グラフを作成する必要があります。このグラフはマップとして機能し、アプリケーション内のユーザー フローの概要を示します。作成するには、res フォルダーを右クリックし、新しいリソース ファイルを作成します。 user_flow_graph.xml という名前を付けます。 .ファイルの種類を必ずナビゲーションとしてマークしてください。

Android ナビゲーション コンポーネントを構築する方法
新しいリソース ファイルの作成

すべての航海は本拠地から始まり、私たちも例外ではありません。私たちの家は NavHost と呼ばれています .これは、ユーザーが UI を操作するときに宛先が交換されるプレースホルダーとして機能します。アクティビティのメイン レイアウトに NavHost を追加する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/user_flow_graph" />

</androidx.constraintlayout.widget.ConstraintLayout>

フラグメントが表示され、交換される場所を収容するフラグメント要素を追加しました。 navGraph に注意してください 以前に作成した XML ファイルにリンクした属性です。

開始宛先を追加する必要があります。追加しないとアプリケーションがコンパイルされないからです。

user_flow_graph.xml を開いた状態で、ナビゲーション エディターの小さなプラス アイコンをクリックする必要があります。

Android ナビゲーション コンポーネントを構築する方法
宛先を追加

ポップアップするメニューで、後で入力する必要があるプレースホルダーを作成するか、任意のフラグメントから選択できることがわかります。

Android ナビゲーション コンポーネントを構築する方法
目的地の選択

ユーザー フローは Start Fragment から始まるので、最初に選択しましょう。

Android ナビゲーション コンポーネントを構築する方法
私たちの本拠地 (小さな ? アイコンに注目してください)

他の 2 つのフラグメント、フラグメント A とフラグメント B を追加しましょう。

Android ナビゲーション コンポーネントを構築する方法
すべての目的地

目的地にカーソルを合わせると表示されるドットをクリックして別の目的地にドラッグすることで、2 つの目的地を接続します。

Android ナビゲーション コンポーネントを構築する方法
かなりきれい。ん?

開始フラグメントとフラグメント A および B の間に作成したのは、アクション です。 .

シバ ミー ティンバーズ

宛先を接続するだけで、ここでの作業が完了し、魔法のような方法ですべてが機能するのではないかと自問したかもしれません.

そうはなりません。

宛先にナビゲートするようコードに指示する必要があります。では、どうすればそれができるでしょうか。このプロセスには魔法が使われています。

最初に行うことは、Safe Args という gradle プラグインを追加することです .目的地間を移動するときのタイプ セーフを保証します。


buildscript {
   /...
    }
    dependencies {
        ...
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.0.0"
        
    }
}

また、次のプラグインをアプリケーションの build.gradle に追加する必要があります:

apply plugin: "androidx.navigation.safeargs.kotlin"

また、android.useAndroidX=true であることを確認してください gradle.properties ファイルで。

先に進む前に、これらすべての構成を追加する必要がある理由を理解しましょう。基本的に、以前にアクションを作成したときに、バックグラウンドで Android Studio がアクションをアクティブにするために使用するコードを生成します。このコードは、各アクションを表すメソッドとクラスで構成されています。例として Start フラグメントを見てみましょう。宣言したアクション用に生成されたコードには、StartFragmentDirections というクラスがあります。 .このクラスのメソッドは、以前に作成したアクションを表します。したがって、両方のフラグメントについて、次の結果が得られます。

  • StartFragmentDirections.actionStartFragmentToFragmentA()
  • StartFragmentDirections.actionStartFragmentToFragmentB()

アクションがコードに変換されたので、それを使用してみましょう:

val action = StartFragmentDirections.actionStartFragmentToFragmentA()

このプロセスの最後のステップでは、NavController を使用する必要があります。このオブジェクトは、NavHost 内のナビゲーションを管理します。次の 3 つの方法のいずれかを使用してアクセスできます。

  • Fragment.findNavController()
  • View.findNavController()
  • Activity.findNavController(viewId:Int)

まとめると、次のようになります。

fragmentABtn.setOnClickListener { button ->
    val action = StartFragmentDirections.actionStartFragmentToFragmentA()
    button.findNavController().navigate(action)
}

帆を整える

宛先間でデータを渡したい場合はどうすればよいでしょうか?ユーザーが特定のアイテムをクリックした場合、次の目的地でそのアイテムで何かをしたいというシナリオを想像してみてください。そのために、宛先引数があります。 user_flow_graph.xml を開き、Fragment A をクリックします。右側に、Fragment A のさまざまな属性の詳細を示すメニューが表示されます。これらの属性の 1 つが Arguments です。

Android ナビゲーション コンポーネントを構築する方法

引数を追加するには、➕ アイコンをクリックするだけです。ポップアップ ウィンドウが開き、そこで引数を構成できます。名前を付けて、タイプを選択し、デフォルト値を追加できます。 Start フラグメントから渡されるメッセージとなる Fragment A に String 型の引数を追加しましょう。

Android ナビゲーション コンポーネントを構築する方法

アクションを定義し、生成されたメソッドを呼び出している Start フラグメントで、引数を渡します。

fragmentABtn.setOnClickListener { button ->
    val action = StartFragmentDirections.actionStartFragmentToFragmentA("Hello From Start Fragment")
    button.findNavController().navigate(action)
}

フラグメント A でアクセスするには、次のいずれかが必要です:

  • バンドルにアクセスしてメッセージ値を取得
class FragmentA: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val bundle = arguments
        val root = inflater.inflate(R.layout.fragment_a, container, false)
        val textView : TextView = root.findViewById(R.id.textView)
        textView.text = bundle?.getString("message")
        return root
    }
}
  • -ktx 依存関係を使用している場合は、navArgs を使用してください
class FragmentA: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val args : FragmentAArgs by navArgs()
        val root = inflater.inflate(R.layout.fragment_a, container, false)
        val textView : TextView = root.findViewById(R.id.textView)
        textView.text = args.message
        return root
    }
}

✋ navArgs を使用する場合、build.gradle ファイルに Java8 のサポートを追加する必要があります。

ここに示されているすべてのコードは、この GitHub リポジトリにあります。


  1. Android でデータをバインドする方法

    データ バインディングは、視覚的なユーザー入力要素に情報 (データ) を接着するときに使用する手法です。このプロセスでは、入力が更新されるたびに、その背後にあるデータも更新されます。 これは決して新しい概念ではなく、これを設計に組み込んだフレームワークが多数あります (AngularJS/React/Vue など)。 この記事で注目するのは、フロントエンド フレームワークではなく、モバイル開発です。 Google は、Android Jetpack の一部である Data Binding Library を Android に導入しました。 Jetpack ライブラリ スイートに慣れ

  2. 電話で Web アプリを作成する方法 – Python &Pydroid Android アプリ チュートリアル

    やあ、元気?私は 18 歳のバックエンド開発者であり、意欲的な機械学習エンジニアです。この記事では、Python を使用して携帯電話で Web アプリを作成する方法について書いていきます 😁.掘り下げてみましょう。 要件 ここで最初に必要なのは、少なくともバージョン 6.0 以降の Android スマートフォンです。しかし、それで十分だと言ったらどうしますか?話がうますぎる。 次に行う必要があるのは、pydroid3 というモバイル アプリケーションを電話にインストールすることです。 ご覧のとおり、pydroid3 は携帯電話で Python を記述できるモバイル アプリケ