You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:29:52