Android Studio布局与真机显示不一致问题求助
问题:SplashActivity布局预览正常但真机仅显示单张图片
SplashActivity布局在Android Studio预览中显示正常,但真机运行时仅显示splash_image图片,其余文本、底部图片控件均不可见。已尝试清理缓存、重启项目,问题未解决。
真机显示效果
仅顶部的splash_image图片可见,布局内其他所有控件均未显示。
布局XML代码
<?xml version="1.0" encoding="utf-8"?> <!-- ~ /** ~ * Created by Alok ~ * Copyright (c) 2023 . All rights reserved. ~ */ --> <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:id="@+id/activity_splash" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="92dp" android:src="@drawable/splash_image" app:layout_constraintBottom_toTopOf="@+id/textView7" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.412" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0" /> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="320dp" android:text="@string/app_name" android:textColor="@color/blackish" android:textSize="30sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="26dp" android:text="Crafted by ❤ with Alok" android:textColor="@color/blackish" android:textSize="24sp" android:textStyle="italic" android:visibility="visible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView7" /> <TextView android:id="@+id/textView10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="146dp" android:text="Powered by" android:textColor="@color/primaryColor" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView8" /> <ImageView android:layout_width="300dp" android:layout_height="wrap_content" android:src="@drawable/logo_gradient" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView10" /> </androidx.constraintlayout.widget.ConstraintLayout>
Java代码
/* * * * * Created by Alok * * Copyright (c) 2023 . All rights reserved. * */ package com.devlomi.alok.activities; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.app.ActivityCompat; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import com.devlomi.alok.R; import com.devlomi.alok.activities.authentication.AuthenticationActivity; import com.devlomi.alok.activities.main.MainActivity; import com.devlomi.alok.activities.setup.EnterUsernameActivity; import com.devlomi.alok.activities.setup.SetupUserActivity; import com.devlomi.alok.model.constants.EncryptionType; import com.devlomi.alok.utils.DetachableClickListener; import com.devlomi.alok.utils.MyApp; import com.devlomi.alok.utils.network.FireManager; import com.devlomi.alok.utils.PermissionsUtil; import com.devlomi.alok.utils.SharedPreferencesManager; //this is the First Activity that launched when user starts the App public class SplashActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 451; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.AppTheme);//revert back to default theme after loading splash image setContentView(R.layout.activity_splash); String DarkMode = SharedPreferencesManager.getDarkMode(); if(DarkMode.matches("night")){ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); }else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } // Toast.makeText(SplashActivity.this, DarkMode, Toast.LENGTH_SHORT).show(); if (!SharedPreferencesManager.hasAgreedToPrivacyPolicy()) { startPrivacyPolicyActivity(); //check if user isLoggedIn } else if (!FireManager.isLoggedIn()) { startLoginActivity(); //request permissions if there are no permissions granted } else if (MyApp.context().getString(R.string.encryption_type).equalsIgnoreCase(EncryptionType.E2E) && !SharedPreferencesManager.isE2ESaved()) { startSaveE2EActivity(); } else if (FireManager.isLoggedIn() && !PermissionsUtil.hasPermissions(this)) { requestPermissions(); } else { startNextActivity(); } } private void requestPermissions() { ActivityCompat.requestPermissions(this, PermissionsUtil.permissions(), PERMISSION_REQUEST_CODE); } private void startLoginActivity() { Intent intent = new Intent(this, AuthenticationActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); } private void startSaveE2EActivity() { Intent intent = new Intent(this, SaveE2EActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); } private void startPrivacyPolicyActivity() { Intent intent = new Intent(this, AgreePrivacyPolicyActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); } private void startNextActivity() { if (!SharedPreferencesManager.hasAgreedToPrivacyPolicy()) { startPrivacyPolicyActivity(); } else if (SharedPreferencesManager.isUserInfoSaved()) { Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } else if (!SharedPreferencesManager.hasEnteredUsername()) { Intent intent = new Intent(this, EnterUsernameActivity.class); startActivity(intent); finish(); } else { String username = SharedPreferencesManager.getUserName(); String localPhotoPath = SharedPreferencesManager.getLocalPhotoPathSetup(); String backupUri = SharedPreferencesManager.getLocalBackupPath(); String dbUri = SharedPreferencesManager.getDbFileUri(); SetupUserActivity.start(this, username, localPhotoPath, backupUri,dbUri); finish(); } } private void showAlertDialog() { DetachableClickListener positiveClickListener = DetachableClickListener.wrap(new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { requestPermissions(); } }); DetachableClickListener negativeClickListener = DetachableClickListener.wrap(new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { finish(); } }); AlertDialog builder = new AlertDialog.Builder(this) .setTitle(R.string.missing_permissions) .setMessage(R.string.you_have_to_grant_permissions) .setPositiveButton(R.string.ok, positiveClickListener) .setNegativeButton(R.string.no_close_the_app, negativeClickListener) .create(); //avoid memory leaks positiveClickListener.clearOnDetach(builder); negativeClickListener.clearOnDetach(builder); builder.show(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (PermissionsUtil.permissionsGranted(grantResults)) { if (!FireManager.isLoggedIn()) startLoginActivity(); else startNextActivity(); } else showAlertDialog(); } }
预期设计效果
布局包含顶部图片、应用名称文本、作者署名文本、"Powered by"提示文本及底部渐变logo,所有控件按约束布局规则完整排列显示。
解决方案
1. 修复Activity跳转时机问题
Java代码中onCreate方法会立即根据条件跳转至其他Activity,真机布局渲染速度慢于跳转逻辑执行速度,导致仅第一张图片完成渲染就被销毁。需添加延迟给布局留足渲染时间:
// 将原有跳转逻辑包裹在延迟任务中 new Handler(Looper.getMainLooper()).postDelayed(() -> { if (!SharedPreferencesManager.hasAgreedToPrivacyPolicy()) { startPrivacyPolicyActivity(); } else if (!FireManager.isLoggedIn()) { startLoginActivity(); } else if (MyApp.context().getString(R.string.encryption_type).equalsIgnoreCase(EncryptionType.E2E) && !SharedPreferencesManager.isE2ESaved()) { startSaveE2EActivity(); } else if (FireManager.isLoggedIn() && !PermissionsUtil.hasPermissions(this)) { requestPermissions(); } else { startNextActivity(); } }, 1500); // 延迟1.5秒执行跳转
2. 调整布局约束避免溢出
textView7设置的android:layout_marginBottom="320dp"在高分辨率设备上会导致控件被挤出屏幕,进而让依赖它的其他控件错位不可见。修改为完整垂直约束链:
<TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:textColor="@color/blackish" android:textSize="30sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/textView8" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" />
为所有控件建立明确的上下依赖关系,避免固定margin导致的布局溢出。
3. 调整深色模式切换时机
在setContentView之后切换深色模式会触发布局重绘,导致控件显示异常。将深色模式切换代码移至setContentView之前:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先设置深色模式 String DarkMode = SharedPreferencesManager.getDarkMode(); if(DarkMode.matches("night")){ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); }else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } setTheme(R.style.AppTheme); setContentView(R.layout.activity_splash); // 后续延迟跳转逻辑... }
内容的提问来源于stack exchange,提问作者Alok Kumar
相关产品推荐
相关产品推荐

