LoginSignup
miwa19970514
@miwa19970514

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Kotlinの画面遷移がうまくいかない

解決したいこと

kotlinでアプリケーションを自作しています。

ユーザ登録画面で情報を入力し登録ボタンを入力した後にホーム画面に遷移させたいです。
以下のコードで実行すると、真っ白な画面が表示されてしまい、本来意図した最初に表示されるべきユーザ登録画面が表示されません。

解決方法を教えてください。
特徴的なエラーはLogCatに表示されていません。

該当するソースコード

🔳MainActivity.kt
package com.example.myapplication2

import android.util.Log
import android.app.AppOpsManager
import android.provider.Settings
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import com.example.myapplication2.ui.theme.MyApplication2Theme
import com.google.firebase.firestore.FirebaseFirestore
import androidx.compose.material.icons.filled.*
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.google.firebase.auth.FirebaseAuth

private const val TAG = "MainActivity"

class MainActivity : ComponentActivity() {
private lateinit var dbConnection: dbConnection
private lateinit var userRegistration: UserRegistration
private lateinit var auth: FirebaseAuth

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    dbConnection = dbConnection(FirebaseFirestore.getInstance())
    userRegistration = UserRegistration(FirebaseFirestore.getInstance())
    auth = FirebaseAuth.getInstance()
    setContent {
        MyApplication2Theme {
            DisplayNav(userRegistration)
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                val permissionResult = checkReadStatsPermission(this)
                Log.d("PermissionCheck", "Result: $permissionResult")
                val usageStatsClass = UsageStatsClass(this)
                usageStatsClass.readOneDayUsageStats()
                val usageStats = usageStatsClass.readOneDayUsageStats()
                dbConnection.uploadusestate(usageStats)
                Log.d(TAG,"OnCreate Call")
            }
        }
    }
}

override fun onStart() {
    super.onStart()
    Log.d(TAG,"onStart Called")
    val currentUser = auth.currentUser
    if(currentUser != null){
        currentUser.reload().addOnCompleteListener{ task ->
            if(task.isSuccessful){
                Log.d(TAG,"User reloaded")
            } else {
                Log.e(TAG,"Failed to reload user")
            }

        }
    }
}

override fun onResume() {
    super.onResume()
    Log.d(TAG,"onResume called")
}

override fun onPause() {
    super.onPause()
    Log.d(TAG, "onPause Called")
}

override fun onStop() {
    super.onStop()
    Log.d(TAG, "onStop Called")
}

override fun onDestroy() {
    super.onDestroy()
    Log.d(TAG, "onDestroy Called")
}

}

fun checkReadStatsPermission(context: Context): Boolean {
val aom: AppOpsManager? = context.getSystemService(Context.APP_OPS_SERVICE) as? AppOpsManager
if (aom != null) {
val mode: Int = aom.checkOp(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
context.packageName
)
if (mode == AppOpsManager.MODE_DEFAULT) {
if (context.checkPermission(
"android.permission.PACKAGE_USAGE_STATS",
android.os.Process.myPid(),
android.os.Process.myUid()
) == PackageManager.PERMISSION_GRANTED
) {
// 使用状況統計の権限がある場合
return true
} else {
// 使用状況統計の権限がない場合
// 画面遷移などの処理を行う
context.startActivity(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS))
return false
}
} else {
// MODE_DEFAULTでない場合は、MODE_ALLOWEDかMODE_IGNOREのいずれか
return mode == AppOpsManager.MODE_ALLOWED
}
} else {
// aom が null の場合のエラー処理など
return false
}
}

🔳DisplayNav.kt
package com.example.myapplication2

import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import android.util.Log

@Composable
fun DisplayNav(userRegistration: UserRegistration) {

val navController = rememberNavController()

NavHost(navController = navController,
        startDestination = "RegistrationScreen" ) {

    composable( route = "RegistrationScreen") {
        RegistrationScreen(navController = navController,userRegistration)
    }
    composable( route = "HomeIcon") {
        HomeIcon(navController = navController)
    }

}
Log.d("DisplayNav","Called DisplayNav")

}

🔳iconSample.kt

package com.example.myapplication2

import android.util.Log
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.material.icons.filled.Home
import androidx.compose.material3.IconButton
import androidx.compose.runtime.remember
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost

val iconList = listOf (
Icons.Default.Add,
Icons.Default.AccountBox,
Icons.Default.AccountCircle,
Icons.Default.AddCircle,
Icons.Default.List,
Icons.Default.ArrowBack,
Icons.Default.ArrowDropDown,
Icons.Default.ArrowForward,
Icons.Default.Build,
Icons.Default.Call,
Icons.Default.Check,
Icons.Default.CheckCircle,
Icons.Default.Clear,
Icons.Default.Close,
Icons.Default.Create,
Icons.Default.DateRange,
Icons.Default.Delete,
Icons.Default.Done,
Icons.Default.Edit,
Icons.Default.Email,
Icons.Default.ExitToApp,
Icons.Default.Face,
Icons.Default.Favorite,
Icons.Default.FavoriteBorder,
Icons.Default.Home,
Icons.Default.Info,
Icons.Default.KeyboardArrowDown,
Icons.Default.KeyboardArrowLeft,
Icons.Default.KeyboardArrowRight,
Icons.Default.KeyboardArrowUp,
Icons.Default.LocationOn,
Icons.Default.Lock,
Icons.Default.MailOutline,
Icons.Default.Menu,
Icons.Default.MoreVert,
Icons.Default.Notifications,
Icons.Default.Person,
Icons.Default.Phone,
Icons.Default.Place,
Icons.Default.PlayArrow,
Icons.Default.Refresh,
Icons.Default.Search,
Icons.Default.Send,
Icons.Default.Settings,
Icons.Default.Share,
Icons.Default.ShoppingCart,
Icons.Default.Star,
Icons.Default.ThumbUp,
Icons.Default.Warning,
)

//画面遷移
fun onRegisterClicked(email:String,password:String,userRegistration: UserRegistration) {
userRegistration. registration(email,password)
}

//メールアドレス登録画面
@Composable
fun RegistrationScreen(
navController:NavController,
userRegistration: UserRegistration
)
{
Log.d("RegistrationScreen","RegistrationScreen Composable is called")
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }

Column(
    modifier = Modifier.fillMaxSize(),
    horizontalAlignment = Alignment.CenterHorizontally,
    verticalArrangement = Arrangement.Center
)
{
    // Email入力フィールド
    TextField(
        value = email,
        onValueChange = { email = it },
        label = { Text("Email") },
        modifier = Modifier.padding(16.dp)
    )

    // Password入力フィールド
    TextField(
        value = password,
        onValueChange = { password = it },
        label = { Text("Password") },
        modifier = Modifier.padding(16.dp)
    )
    Button(
        onClick = {
            onRegisterClicked(email, password,userRegistration)
            navController.navigate("HomeIcon")
                  },
        modifier = Modifier.padding(16.dp)
    ) {
        Text("Register")
    }
}

}

//ホーム画面(作成中)
@Composable
fun HomeIcon(navController: NavController){
Row (
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.Bottom
) {
IconButton(
onClick = {
println("Clicked!")
},
modifier = Modifier
.size(48.dp)
.padding(vertical = 8.dp)
) {
Icon(
imageVector = Icons.Default.Home,
contentDescription = "Add",

            )
    }
    IconButton(
        onClick = {
        println("Clicked!")
    },
        modifier = Modifier
            .size(48.dp)
            .padding(vertical = 8.dp)
    ) {
        Icon(
            imageVector = Icons.Default.Settings,
            contentDescription = "Add",
            )
    }
}

}

🔳build.gradle.kts
import java.util.Properties

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.gms.google-services")
id("kotlin-kapt")
}

android {
namespace = "com.example.myapplication2"
compileSdk = 34

val properties = Properties()
properties.load(rootProject.file("local.properties").inputStream())
val googleOauthServerClientId = properties.getProperty("google_oauth_server_client_id")

defaultConfig {
    applicationId = "com.example.myapplication2"
    minSdk = 32
    targetSdk = 34
    versionCode = 1
    versionName = "1.0"

    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    vectorDrawables {
        useSupportLibrary = true
    }

    buildConfigField("String", "GOOGLE_OAUTH_SERVER_CLIENT_ID", "${googleOauthServerClientId}")
    buildFeatures {
        buildConfig = true
        viewBinding = true
    }


}

buildTypes {
    release {
        isMinifyEnabled = false
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
    buildFeatures {
        viewBinding = true
    }
}
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}
buildFeatures {
    compose = true
}
composeOptions {
    kotlinCompilerExtensionVersion = "1.5.1"
}
packaging {
    resources {
        excludes += "/META-INF/{AL2.0,LGPL2.1}"
    }
}
packagingOptions {
    resources {
        // 'META-INF/gradle/incremental.annotation.processors'を除外する
        excludes += "/META-INF/gradle/incremental.annotation.processors"
    }
}

}

dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
implementation(platform("androidx.compose:compose-bom:2023.08.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
implementation(platform("com.google.firebase:firebase-bom:32.7.1"))
implementation("com.google.firebase:firebase-auth-ktx")
implementation("com.google.android.gms:play-services-auth:21.0.0")
implementation ("com.google.firebase:firebase-firestore-ktx")
implementation("com.google.firebase:firebase-firestore")
implementation("com.google.firebase:firebase-auth:22.3.1")
implementation("com.google.android.gms:play-services-auth:21.0.0")
implementation("com.google.dagger:hilt-android:2.40.5")
implementation("com.google.dagger:hilt-android-compiler:2.40.5")
implementation("androidx.navigation:navigation-compose:2.7.7")

}

自分で試したこと

Displayメソッドが呼び出されていること。

0

No Answers yet.

Your answer might help someone💌