当我把它称为中的onCreate(findViewById()返回null) [英] findViewById() returns null when I call it in onCreate()

查看:117
本文介绍了当我把它称为中的onCreate(findViewById()返回null)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的第一个Android应用程序与findViewById一个问题。我想调用这个函数,但总是返回null。

我的应用程序有2个活动。在第二项活动(activity_display_message)我有这个code:

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_display_message);

    如果(savedInstanceState == NULL){
        getSupportFragmentManager()的BeginTransaction()
                。新增(R.id.container,新PlaceholderFragment())
                。承诺();
    }

    // Obtener报mensaje EL修订于恩意向MainActivity
    意向意图= getIntent();
    字符串消息= intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Buscar EL的TextView连接拉维斯塔
    TextView中的TextView =(TextView中)findViewById(R.id.texto);
    textView.setText(消息);
}
 

这是fragment_display_message.xml

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:以下属性来=@扪/ activity_horizo​​ntal_margin
机器人:paddingRight =@扪/ activity_horizo​​ntal_margin
机器人:paddingTop =@扪/ activity_vertical_margin
机器人:paddingBottom会=@扪/ activity_vertical_margin
工具:上下文=com.example.app.DisplayMessageActivity $ PlaceholderFragment>

<的TextView
    机器人:ID =@ + ID / texto
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT/>
 

我不知道为什么它返回NULL,并生成一个 NullPointerException异常当我尝试做一个的setText()。我打电话正确的ID,并宣布它在XML了。而且我打电话了 setContextView()的onCreate()

很抱歉,如果这个问题太明显了(我想,我忽略了一些东西明显),但我是新的Andr​​oid开发。

编辑:logcat的错误:

  10月2日至十日:25:58.960 1031至1031年/ com.example.app E / AndroidRuntime:致命异常:主要
工艺:com.example.app,PID:1031
java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.app / com.example.app.DisplayMessageActivity}:显示java.lang.NullPointerException
        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        在android.app.ActivityThread.access $ 800(ActivityThread.java:135)
        在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)
        在android.os.Handler.dispatchMessage(Handler.java:102)
        在android.os.Looper.loop(Looper.java:136)
        在android.app.ActivityThread.main(ActivityThread.java:5017)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:515)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        在dalvik.system.NativeStart.main(本机方法)
 显示java.lang.NullPointerException:产生的原因
        在com.example.app.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:35)
        在android.app.Activity.performCreate(Activity.java:5231)
        在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
 

编辑:

问题解决了。只需要从的onCreate移动code() onCreateView()并编辑引用。

的onCreate()将是默认的。

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_display_message);

    如果(savedInstanceState == NULL){
        getSupportFragmentManager()的BeginTransaction()
                。新增(R.id.container,新PlaceholderFragment())
                。承诺();
    }
}
 

onCreateView() PlaceholderFragment

  @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_display_message,集装箱,假);

        // Obtener报mensaje EL修订于恩意向MainActivity
        意向意图= getActivity()getIntent()。
        字符串消息= intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

        // Buscar EL的TextView连接拉维斯塔
        TextView中的TextView =(TextView中)rootView.findViewById(R.id.texto);
        textView.setText(消息);

        返回rootView;
    }
 

解决方案

活动 findViewById()搜索活动的视图层次结构设置与的setContentView()对于给定的视图ID。你似乎在寻找的观点是一个片段,而不是在活动层次结构(还)。片段交易不直接或者这样即使你在活动层次结构将它添加到容器,它不存在连接立即但只有当事务处理。

在理论上是可能的同步执行挂起的片段交易,<一个href="http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions%28%29"><$c$c>executePendingTransactions().然而,这是最好只将code,触及片段的看法在其<一href="http://developer.android.com/reference/android/app/Fragment.html#onCreateView%28android.view.LayoutInflater,%20android.view.ViewGroup,%20android.os.Bundle%29"><$c$c>onCreateView().片段和其承载的活动都应该是相对彼此独立,所以应该避免访问的片段的内部的活性。

I'm having a problem with the findViewById on my first android app. I'm trying to call this function but always return null.

My app have 2 activities. In the second activity (activity_display_message) I have this code:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_message);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    //Obtener el mensaje desde el intent en MainActivity
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    //Buscar el textview en la vista
    TextView textView = (TextView) findViewById(R.id.texto);
    textView.setText(message);
}

And this is the fragment_display_message.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.app.DisplayMessageActivity$PlaceholderFragment">

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

I don't know why it return NULL and generate a NullPointerException when I try to do a setText(). I'm calling the correct Id and declaring it on the XML too. And I'm calling the setContextView() on the onCreate().

Sorry if this question is too obvious (I think that I'm ignoring something obvious) but I'm new on android development.

EDIT: Logcat error:

02-10 10:25:58.960    1031-1031/com.example.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.app, PID: 1031
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.DisplayMessageActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.example.app.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:35)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)

          

Edit:

Problem solved. Just need move the code from onCreate() to onCreateView() and edit the references.

onCreate() will be the default.

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_message);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }
}

And the onCreateView() on PlaceholderFragment:

        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_display_message, container, false);

        //Obtener el mensaje desde el intent en MainActivity
        Intent intent = getActivity().getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

        //Buscar el textview en la vista
        TextView textView = (TextView) rootView.findViewById(R.id.texto);
        textView.setText(message);

        return rootView;
    }

解决方案

Activity findViewById() searches the activity's view hierarchy set with setContentView() for the given view id. The view you appear to be looking for is in a fragment and not in the activity hierarchy (yet). Fragment transactions are not immediate either so even if you add it to the container in the activity hierarchy, it is not attached there right away but only when the transaction is processed.

In theory it's possible to synchronously execute pending fragment transactions with executePendingTransactions(). However, it's better to just move the code that touches a fragment's views in its onCreateView(). Fragments and their hosting activities are supposed to be relatively independent of each other, so an activity accessing a fragment's internals should be avoided.

这篇关于当我把它称为中的onCreate(findViewById()返回null)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆