Activity界面内容不显示,你遇到了吗?

本文记录了一位开发者在创建Android Activity时遇到的界面内容不显示的问题。在确认布局、代码无误后,问题出乎意料地指向了onCreate方法。原来从Android 5.0开始,Activity的onCreate有了新的重载版本,带有两个参数。只有当设置persistableMode为persistAcrossReboots时,才会调用这个带参数的onCreate。解决办法是不设置persistMode或重写onStart,确保界面正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写Activity时遇到的一个问题,在此记录,也分享下,Activity写好运行后,genimotion开启应用,却发现界面不显示内容,后来发现标题栏label也不显示。于是开始排查问题原因,在确认setContentView调用,布局文件填充、编写无误,as没有问题情况下,gradle没有问题下,因为gradle编译其他应用正常,依然不显示,奇怪了,不过还是要继续找问题出在哪儿。

最终问题出现在onCreate方法,是不是很惊讶,的确,压根没想到onCreate方法会出什么问题。

到底出什么问题呢,发现,Activity的Context中有两个onCreate方法,具体如下:

android 5.0 (即android 4.4w,API level是android 20)之前的Activity源码:

    protected void onCreate(Bundle savedInstanceState){
        //...
    }
    
    final void performCreate(Bundle icicle) {
    onCreate(icicle);
    mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(com.android.internal.R.styleable.Window_windowNoDisplay, false);
    mFragments.dispatchActivityCreated();    
   }
    
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    //....
   }

    protected void onSaveInstanceState(Bundle outState) {
    //...
   } 

android 5.0(包含android 5.0,API level是android 21)以后Activity源码:

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //...
    }

    public void onCreate(@Nullable Bundle savedInstanceState,@Nullable PersistableBundle persistentState) {
     onCreate(savedInstanceState);
   }

    final void performCreate(Bundle icicle) {
        onCreate(icicle);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

    final void performCreate(Bundle icicle, PersistableBundle persistentState) {
        onCreate(icicle, persistentState);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }

    final void performCreateCommon() {
     mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(com.android.internal.R.styleable.Window_windowNoDisplay, false);
     mFragments.dispatchActivityCreated();
     mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
   }
 <pre name="code" class="java">    protected void onSaveInstanceState(Bundle outState) {
    //...
   }

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    onSaveInstanceState(outState);
  }

<pre name="code" class="java">    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    //....
   }


public void onRestoreInstanceState(Bundle savedInstanceState,PersistableBundle persistentState) {
    if (savedInstanceState != null) {
      onRestoreInstanceState(savedInstanceState);
    }
  }
 


对比看出:

       android 5.0之后,在原有的onCreate方法上,重载出新onCreate方法,该方法是public修饰,带有两个参数,Bundle、PersistableBundle,重载后的onCreate方法里调用了原有的onCreate方法

       android 5.0之后,在原有performCreate方法上,重载新performCreate方法,并带有两个参数,Bundle、PersistableBundle,方法内部分别对应调用onCreate的方法

       android 5.0之后,将原有performCreate部分代码抽取,新增方法performCreateCommon

       android 5.0之后,onSaveInstanceState,onRestoreInstanceState同样进行重载

原有onCreate方法,是这么描述:

       当Activity启动的时候,会调用该方法,方法内填充界面内容,初始化控件,初始化数据等

重载的onCreate方法,是这么描述:

       跟原有onCreate相同,但是调用该方法的Activity比较特别,这些Activity必须是android.R.attr下的persistableMode模式,并且设置为persistAcrossReboots

在Manifest中的activity设置属性:

android:persistableMode="persistAcrossReboots"
这里有个疑问,是不是将Activity的persistMode配置成persistAcrossReboots,就会在启动Activity时,调用带有PersistableBundle的onCreate方法呢?

配置persistMode配置成persistAcrossReboots,重写onCreate(Bundle icicle, PersistableBundle persistentState) ,加载布局,初始化控件,结果,界面不显示

不配置persistMode,重写onStart(Bundle icicle),加载布局,初始化控件,结果,界面显示

结论:一般情况下,Activity的创建,重写的是onStart(Bundle icicle),而非onCreate(Bundle icicle, PersistableBundle persistentState),正常启动Activity,是不会调用后者的,即便后者内部写了加载布局,初始化控件等这些代码,也不会执行


<think>好的,我现在需要帮用户解决虚拟机开机后图形驱动支持的问题,以及Ubuntu中让Activity常驻显示的问题。用户之前提到过在tty1界面到鼠标光标,关机前正常,第二天突然出现这个问题。可能的原因包括驱动更新失败、虚拟机增强工具问题、或者显示管理器配置错误。首先,图形驱动的问题。根据引用[1]和[2],安装VMwareTools或VirtualBox增强功能是关键步骤。用户可能没正确安装或更新这些工具。需要检查日志,比如Xorg的日志,看看有没有错误信息。另外,引用[3]中提到VirtualBox安装Ubuntu后的一些问题,可能涉及到内核或驱动兼容性,可能需要更新内核或回退到旧版本。 然后,进入tty1后鼠标光标见,可能是因为Xorg没有正确启动,或者驱动支持当前分辨率。可能需要修改GRUB参数,比如添加nomodeset,禁用某些驱动,或者调整显示设置。引用[4]提到转换虚拟机时需要注意磁盘和工具配置,可能驱动兼容导致的问题。关于Ubuntu的Activity常驻显示,用户可能是指让侧边栏或dock一直显示,而是自动隐藏。这通常在系统设置里调整,比如Ubuntu的Dock设置,关闭自动隐藏。如果用户使用的是GNOME,可能需要安装扩展或调整相关配置。 接下来,我需要整理解决步骤。首先处理图形驱动问题,检查增强工具,更新驱动,修改GRUB,重启显示管理器。然后处理Activity常驻显示,通过设置或扩展实现。需要确保每个步骤清晰,并引用相关文献,比如安装增强功能的步骤来自引用[1]和[2]。还要注意用户可能混淆了VMware和VirtualBox,需要分别说明。另外,生成相关问题需要考虑用户可能遇到的后续问题,比如如何检查3D加速支持,增强工具安装失败怎么办,分析Xorg日志的方法,以及GRUB参数的作用。最后,确保回答结构清晰,步骤详细,引用正确,并且语言口语化,让用户容易理解。需要分点列出解决方案,每个步骤附带命令和解释,然后处理Activity的问题,最后相关问题部分引导用户进一步学习。</think>### 虚拟机图形驱动问题解决方案 #### 一、修复图形驱动问题 1. **重新安装增强工具** - **VMware**: ```bash sudo mount /dev/cdrom /mnt # 挂载镜像(引用[1]安装VMware Tools步骤) cd /mnt && sudo ./VMware-install.pl reboot ``` - **VirtualBox**: ```bash sudo apt install build-essential dkms linux-headers-$(uname -r) # 安装依赖(引用[2]) sudo mount /dev/cdrom /mnt sudo /mnt/VBoxLinuxAdditions.run reboot ``` 2. **修改内核启动参数** ```bash sudo nano /etc/default/grub # 修改为:GRUB_CMDLINE_LINUX="nomodeset nouveau.modeset=0" # 禁用nouveau驱动(引用[4]驱动兼容性) sudo update-grub reboot ``` 3. **检查Xorg日志** ```bash cat /var/log/Xorg.0.log | grep "(EE)" # 查看错误日志(引用[3]日志分析思路) ``` 4. **切换显示管理器** ```bash sudo systemctl restart gdm # 重启显示服务(引用[1]图形模式设置) # 若无效,尝试安装LightDM: sudo apt install lightdm sudo systemctl enable lightdm --now ``` #### 二、Ubuntu Activity常驻显示 1. **调整Dock设置** - 打开`Settings` → `Appearance` → 关闭`Auto-hide the Dock` - 或通过命令行: ```bash gsettings set org.gnome.shell.extensions.dash-to-dock autohide false # 禁用自动隐藏 ``` 2. **安装GNOME扩展** - 安装`dconf-editor`调整高级参数: ```bash sudo apt install dconf-editor ``` - 在`dconf-editor`中导航到`org/gnome/shell/extensions/dash-to-dock`,修改`autohide`为`false`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值