如何将自定义视图插入 XML 的 LinearLayout

Posted

技术标签:

【中文标题】如何将自定义视图插入 XML 的 LinearLayout【英文标题】:How to insert custom view into XML's LinearLayout 【发布时间】:2011-05-31 11:14:16 【问题描述】:

所以我有一个从View 扩展而来的CustomView。我有一个来自 XML 的线性布局。 名为example的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/jembalang.comfest.game"
  android:layout_
  android:layout_>
  <jembalang.compfest.game.GameThread
    android:id="@+id/game_view"
    android:layout_
    android:layout_>
  </jembalang.compfest.game.GameThread>
  <Button 
    android:text="Button" 
    android:id="@+id/button1" 
    android:layout_ 
    android:layout_>
  </Button>
</LinearLayout>

以及使用xml的代码

setContentView(R.layout.cobagabung);
gameView = (GameThread) Jembalang.this.findViewById(R.id.game_view);
gameView.setFocusable(true);
gameView.setFocusableInTouchMode(
gameView.start();

如果有帮助,我添加了 GameThread 构造函数

public class GameThread extends View implements Runnable,OnKeyListener
    public GameThread(Context context,AttributeSet attr)
        super(context, attr);
        ...
    
    public GameThread(Context context) 
        super(context);
        ...
    

我认为我的做法有问题,因为findViewById 返回null 我应该怎么做才能让我的CustomView(在这个例子中是GameThread)能够插入到xml中?

【问题讨论】:

你真的在使用完整的包吗? 在顶层使用合并标签而不是线性布局 @Jinda 嗯,是的,我在看developer.android.com/resources/samples/ApiDemos/res/layout/…,它提供了完整的包。 @vnshetty 不,它仍然没有工作:( @dieend 对不起,我无法找到你失踪的地方。你最好用断点调试你的代码。当你的 setContentView 被执行时,你的自定义视图应该被初始化...... 【参考方案1】:

你的行应该是:

gameView = (GameThread) Jembalang.this.findViewById(R.id.game_view);

您传递的是布局的 id,而不是您创建的视图的 id。

你的代码的其余部分看起来不错

【讨论】:

啊,对不起。我打错了。其实和你写的一样。但是不,gameView 仍然是 null。:( 为什么你必须完全限定你的 this 指针才能调用 Jembalang.this.findViewById?您是在调用添加视图的同一个对象吗? gameView实现了Runnable,我需要启动它,所以我需要再次调用它【参考方案2】:

我不知道Jembalang 是什么,但我认为你应该删除它。

gameView = (GameThread) findViewById(R.id.game_view);

【讨论】:

【参考方案3】:

您说您的布局文件名为“example.xml”,但您调用的是 setContentView(R.layout.cobagabung)。因此,您的视图是从“cobagabung.xml”初始化的。

确保布局文件名和 setContentView 调用使用相同的标识符,例如

setContentView(R.layout.example);

【讨论】:

以上是关于如何将自定义视图插入 XML 的 LinearLayout的主要内容,如果未能解决你的问题,请参考以下文章

将自定义视图绑定到点

将自定义视图附加到 Android 键盘的顶部

如何将自定义视图动画化为自定义视图

将自定义布局(从文件)添加到另一个布局

如何将自定义视图添加到布局?

如何将自定义视图拖动为 Xcode 6 中自定义视图的私有属性