【问题标题】:android setContentView not workingandroid setContentView 不起作用
【发布时间】:2012-02-15 18:59:48
【问题描述】:

不是重复的:我的问题比其他所有问题都简单。

我一直在尝试关注android hello world tutorial,但我无法让第一个示例工作。

这是我的代码:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hello, Android");
        setContentView(tv);
    }
}

如您所见,我直接从教程中复制并粘贴了出来。 问题是,它不是显示 Hello, Android,而是显示 layout/main.xml 文件中的任何内容。如果该文件不存在,它将关闭而不显示任何内容。

为什么这不起作用?

由于我直接从官方文档中复制了这个,我什至不知道从哪里开始尝试调试它。您可以提供的任何指示或建议将不胜感激!

编辑:按要求发布我的 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Hello World, HelloAndroid"
    />
</LinearLayout>

请注意,这是我启动项目时自动创建的,我没有放在那里。

【问题讨论】:

  • 如果您已经创建了该文件,这意味着您没有以线性方式遵循本教程或返回到上一步。清理并重新构建您的项目。
  • 另外,你也可以发布你的 main.xml 吗?
  • @Brian 我没有创建那个文件;它是在我开始一个新项目时自动创建的。
  • 有没有试过在onCreate方法中设置断点,看看是否真的被调用了?据我所见,它应该可以工作。可能您的项目没有正确上传到模拟器。
  • 我刚刚用您的代码尝试了您的示例,它似乎正确显示了文本(动态显示,而不是来自 main.xml)。我建议您再次执行这些步骤,并确保您没有遗漏任何内容。

标签: java android


【解决方案1】:

为什么会有两个 TextView 的文本相同?你不应该这样做,如果你只打算使用一个,那就只使用一个。

您的 XML 可以正常使用,但您的 Activity 代码需要更改:

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

这是你在做什么的解释......

您正在动态构建 TextView 并将 ContentView 设置为该 TextView 很好,但这不是您的初衷。您的初衷或示例的初衷是使用布局文件,然后将那个activity的contentview设置为那个布局文件,而不仅仅是那个textview。

更新

代替OP所说的,他确实想动态构建一个TextView实例并将其应用于屏幕。如果是这种情况,那么您必须...:

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT));
        tv.setText("Hello, Android");
        setContentView(tv);
    }
}

这里唯一的区别是 TextView 的属性定义了它在屏幕上的显示方式。您可以使用 FILL_PARENT 或 WRAP_CONTENT。

【讨论】:

  • 我不想使用xml,因为我需要能够动态设置内容。 “动态构建 TextView 并将 ContentView 设置为该 TextView”正是我想要做的,但我不知道该怎么做。
  • 错误是什么?那你为什么有一个main.xml?如果您正在设置内容,那么没关系。然而;您必须定义该 TextView 的布局参数。否则 WindowManager 将不知道如何绘制它,它会抱怨。
  • 任何时候你在stackoverflow上发帖都需要发布你的logcat错误,这样我们才能看到错误是什么。仅仅说“它崩溃了”是不够的,我们必须知道为什么。此信息在日志中。
  • 我有 main.xml,因为它在我创建项目时默认就在那里——就像我说的,我没有把它放在那里;我只是按照教程,完全按照它说的去做。什么是logcat?如果你愿意,我可以发布日志,但它真的很长。我的程序没有崩溃,只是没有按照我的意愿去做(以及教程所说的它会做的事情)。
  • 你期望它应该做什么?它应该做的就是显示 Text hello world。
【解决方案2】:

您尚未在应用程序中设置 xml 文件或布局。您是直接调用视图。您需要在布局下调用视图。

语法:setContentView(R.layout.your xml 文件名);

【讨论】:

    【解决方案3】:

    关于 logcat 的问题,您可以在 Eclipse 的 Debug 透视图中找到它。它是来自系统和用户代码的错误消息日志。

    【讨论】:

      【解决方案4】:

      试试这个:你不需要在最后做setContentView。如果你这样做,它将覆盖你在 XML 中的内容。

      @Override     
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.yourxmlfile);
          TextView tv = (TextView)findViewById(R.id.helloText);
          tv.setText("Hello, Android");
      }
      
      <TextView
          android:id="@+id/helloText"
          android:layout_width="fill_parent"    
          android:layout_height="wrap_content"
          android:text="Hello World, HelloAndroid" />
      

      【讨论】:

      • 没有帮助。 1)必须先定义 tv 才能将其用作参数,2)尝试将其放在定义和 settext 之间,但没有做任何事情。
      • 对不起!我的错。我已经用正确的语法更新了我的答案。
      • 等等,这不正是我不希望它做的事情吗?看起来你放在那里的就是它已经做的,我试图找出如何让它不做,也就是说从 xml 文件中读取而不是以编程方式生成。
      • 如果要显示 main.xml 中的内容,不需要添加最后两行代码。换句话说,如果您想看到“Hello,Android”,请在我的回答中使用确切的代码。如果您想看到“Hello World,HelloAndroid”,请从我的答案中删除最后两行。
      • @Benubird:你是对的,答案不正确。前两行从 xml 文件加载布局,最后两行创建一个 TextView,由于不存在对它的引用而立即删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多