📱

Android:どこアクティビティにいるのか検出

2022/10/18に公開

はじめに

処理を共通化したときなど、どのActivityで動作しているのか調べたいときがあります。
結論としては、

localClassName

を使います。

サンプルコード 1 -Activityから取得-

下記のサンプルコードでは、現在表示されている画面のActivity名をTextViewに表示します。

MainActivity.kt
MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val activityName = localClassName

        val textView = findViewById<TextView>(R.id.displayActivityName)
        textView.text = activityName
    }
}
activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/displayActivityName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Activity名は下記の一行で取得しています。

MainActivity.kt
val activityName = localClassName

サンプルコード 2 -Fragmentから取得-

Fragmentから現在表示しているActivity名を表示するサンプルコードです。

MainActivity.kt
MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
	
        val fragment = FragmentActivity()
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.add(R.id.container, fragment)
        fragmentTransaction.commit()
    }
}
activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xmlにFragmentを表示させる部分として、LinearLayoutを指定しています。

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" />

そして、先程のLinearLayoutにFragmentを表示させるコードは下記のとおりになります。

val fragment = FragmentActivity()
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.add(R.id.container, fragment)
fragmentTransaction.commit()

Fragmentにかかわるコードを下記に示します。

FragmentActivity.kt
FragmentActivity.kt
class FragmentActivity: Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.activity_fragment, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val activity = activity
        val activityName = activity?.localClassName

        val textView = view.findViewById<TextView>(R.id.displayActivityName)
        textView.text = activityName
    }
}
activity_fragment.kt
activity_fragment.kt
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/displayActivityName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

まず、activityメソッドでFragmentが紐付けられているActivityを返し、localClassNameでそのActivity名を取得しています。

val activity = activity
val activityName = activity?.localClassName

おわりに

このようにActivity名を取得したすることで、処理を共通化したときに、if文やwhen文でActivityごとに処理を分けることに役立ちます。処理を共通化するときのtipsは別途記事にまとめているので、ぜひ参考にしてください。

https://zenn.dev/takudooon/articles/31aacfff76d37b

Discussion