代码之家  ›  专栏  ›  技术社区  ›  Freelancer

Android应用中的全局视图和局部视图

  •  0
  • Freelancer  · 技术社区  · 6 年前

    我刚刚写了一个简单的Android应用程序,只有一个线性布局。我用这个线性布局作为 财产 作为一个阶级 方法(例如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);
        }
    }
    

    getApplicationContext 方法。直到 onCreate 方法被调用。这是真的吗?

    enter image description here

    java.lang.RuntimeException异常:无法实例化活动 组件信息{localglobal/localglobal.main活动}: java.lang.NullPointerException异常:尝试调用虚拟方法 android.content.Context环境.getApplicationContext()'在空对象上 参考 在android.app.ActivityThread活动线程.handleLaunchActivity(java:2360) 在android.app.ActivityThread活动线程.access 800美元(ActivityThread.java:144) 在android.os.Handler程序.调度消息(Handler.java:102) 在android.os.Looper系统.回路(Looper.java:135) 在android.app.ActivityThread活动线程.主要(ActivityThread.java:5221) 在java.lang.reflect文件.方法.invoke(本机方法) 在java.lang.reflect文件.方法.invoke(方法.java:372) 在com.android.internal网站.合子体$MethodAndArgsCaller.run运行(ZygoteInit.java:899) 在com.android.internal网站.os.ZygoteInit.main公司(ZygoteInit.java:694) 原因:java.lang.NullPointerException异常:尝试调用虚拟方法'android.content.Context环境 android.content.Context环境.getApplicationContext()'在空对象上 参考 在android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:105) 在java.lang.reflect文件.构造函数.newInstance(本机方法) 在java.lang.Class类.新实例(java类:1572) 在android.app.Instrumentation工具.新活动(仪器.java:1065) 在android.app.ActivityThread活动线程.handleLaunchActivity(java:2360) 在android.app.ActivityThread活动线程.access 800美元(ActivityThread.java:144) 在android.os.Handler程序.调度消息(Handler.java:102) 在java.lang.reflect文件.方法.invoke(本机方法) 在java.lang.reflect文件.方法.invoke(方法.java:372) 在com.android.internal网站.合子体$MethodAndArgsCaller.run运行(ZygoteInit.java:899) 在com.android.internal网站.os.ZygoteInit.main公司(ZygoteInit.java:694)

    1 回复  |  直到 6 年前
        1
  •  0
  •   TheWanderer    6 年前

    当一个上下文对象第一次被初始化时,它还没有准备好作为上下文使用,它的大多数方法都会返回 null

    当您有:

    LinearLayout root = new LinearLayout(getApplicationContext());
    

    作为一个全局变量,Java将在MainActivity初始化时尝试初始化LinearLayout, 之前 上下文已附加或准备好。 getApplicationContext() 很可能会回来 this 会导致错误,因为视图在初始化期间使用上下文来调用 getResources() ,此时也将为空。

    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(在 /res/layouts/

    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>