当前位置: 首页 > 知识库问答 >
问题:

Android应用中的全局视图和本地视图

归鸿朗
2023-03-14

我刚刚编写了一个仅带有LinearLayout的简单Android应用程序。我将此LinearLayout用作类的属性和方法的本地对象(例如在onCreate方法中)。

第一种情况:作为财产的线性布局

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    LinearLayout root = new LinearLayout(getApplicationContext());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(root);
    }
}

第二种情况:作为方法对象的线性布局

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout root = new LinearLayout(getApplicationContext());
        setContentView(root);
    }
}

在这两种情况下,都没有错误。然而,当我在模拟器或设备上运行时,第一个案例出现了如下错误。为什么?我认为这个问题是由方法引起的。在调用onCreate方法之前,该方法的上下文尚未初始化。这是真的吗?

E/AndroidRuntime: FATAL EXCEPTION: main Process: localglobal, PID: 6701ooper.loopRuntimeException:无法实例化活动ComponentInfo{localglobal/localglobal. MainActive}:ooper.java:135NullPointerException:尝试在java.lang.reflect.ActivityTethod.invokeLaunchActive(ActivityTjava.lang.reflect.)的空对象引用上调用虚拟方法“android.app.上下文hread.mainChread.java:5221Application ationContext()”在ethod.invokeActivityTethod.java:372LaunchActive(ActivityTcom.android.internal.os.)在aller.runActivityTnit.java:899800美元(ActivityThread.java:144)在android.app.ActivityThread$H. handleMessage(ActivityThread.java:1278)在android.os.Handler.dispatchMessage(andler.java:102H)在android.os.Ljava.lang.(Ljava.lang.)在android.content.ActivityTandroid.content.(ActivityTontext.get)在android.app.Mhread.perform(本机方法)在hread.java:2209Mandroid.app.(Mhread.handle)在hread.java:2360ZygoteInit$MachodAndArgsCandroid.app.(ZygoteIhread.access)在com. android. os。位于localglobal的ContextWrapper. getApplication ationContext(ContextWrapper. java: 105)。java. lang. rey处的MainActive.(MainActive. java: 9)。java. lang处的构造器. newInstance(本机方法)。android. app. Instrumentation. newActive(Instrumentation. java: 1065)在android. app. ActivityThread. performLaunchActive(ActivityThread. java: 2199)在android. app. ActivityThread. handleLaunchActive(ActivityThread. java: 2360)

共有1个答案

陆运乾
2023-03-14

当第一次初始化上下文对象时,它还没有准备好用作上下文,它的大多数方法将返回null。Activity类是Context类的扩展,因此遵循相同的规则。

当你有:

LinearLayout root = new LinearLayout(getApplicationContext());

作为一个全局变量,Java将在MainActivity初始化时,在连接或准备上下文之前,尝试初始化LinearLayoutgetApplicationContext()很可能返回null,尽管即使传递该值也会导致错误,因为视图在初始化过程中使用上下文来调用getResources(),此时该值也将为null。

这就是Android提供onCreate()方法的原因。只有在连接了上下文并准备好使用后,才会调用此方法。

如果您想要一个全局LinearLayout变量,请执行以下操作:

public class MainActivity extends AppCompatActivity {
    private LinearLayout root;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        root = new LinearLayout(this);
        setContentView(root);
    }
}

然而,这并不是Android真正工作的方式。相反,您应该创建一个布局XML(在Android Studio的/res/layouts/下,无论如何都应该为您完成这项工作),您可以在XML中定义布局,并为视图提供ID。然后在活动中:

public class MainActivity extends AppCompatActivity {
    private LinearLayout root;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.your_layout_name);
        root = findViewById(R.id.whatever_id_you_gave_your_linearlayout_in_xml);
    }
}

您的布局XML可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:id="@+id/whatever_id_you_gave_your_linearlayout_in_xml"
    android:orientation="vertical">

    <TextView
        android:id="@+id/some_other_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
     />

     <Button
        android:id="@+id/a_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
     />

</LinearLayout>
 类似资料:
  • 我们需要一个应用内通知栏。任何时候,当应用程序收到一个推送通知,无论哪个活动在前面,通知栏需要显示和浮动在活动的顶部。它是半透明的,如果自定义点击它,它会消失。 Android似乎没有窗口框架(如IOS或Web),因此我们无法在没有活动上下文的情况下绘制通知栏。我们需要让每个活动都有一个通知栏,然后当通知到来时,我们会显示当前前置活动的通知栏。 我认为这个解决方案很愚蠢……我想让我的应用程序的通知

  • 我想制作一个应用程序,以网格模式显示文档、pdf、txt等文本文件,就像ImageView显示图像一样。在android中是否有这些文件的视图。代码如下所示,在此我可以查看网格中的图像,但不能查看文档文件。

  • 我正在android中测试Navigation Drawer示例项目,在设置Navigation view配置文件标题中的文本时遇到问题。 这是我的代码: 主要活动。JAVA 主要活动。xml 导航总管总管。xml 当我试图设置textview的文本时,我总是会遇到这个错误,而且只有在api级别23时才会发生: 如何从主活动更改nav_header_main.xml的Textview文本? 提前谢

  • 简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。 此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。 我们的数组是: [0 1 2 3 4 5] 调用 id() 函数: 139747815479536 a 赋值给 b: [0 1 2 3 4 5] b 拥有相

  • 英文原文:http://emberjs.com/guides/views/adding-layouts-to-views/ 视图可以拥有一个次模板来包裹其主模板。如同模板一样,布局是可以插入到视图标签下的Handlebars模板。 通过设置layoutName属性来配置视图的布局模板。 而布局模板通过Handlebars的{{yield}}助手来指定在哪里插入主模板。视图渲染后的template的

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为