Как вставить пользовательское представление в LinearLayout XML

Итак, у меня есть CustomView, который расширен от View. А у меня линейная верстка из XML. XML с именем example:

<?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_width="fill_parent"
  android:layout_height="fill_parent">
  <jembalang.compfest.game.GameThread
    android:id="@+id/game_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
  </jembalang.compfest.game.GameThread>
  <Button 
    android:text="Button" 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
  </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?


person dieend    schedule 31.05.2011    source источник
comment
вы на самом деле используете полный пакет?   -  person Kakey    schedule 31.05.2011
comment
используйте тег слияния вместо линейного макета на верхнем уровне   -  person vnshetty    schedule 31.05.2011
comment
@Jinda хм, да, я смотрю на developer.android.com /resources/samples/ApiDemos/res/layout/ и дает полный пакет.   -  person dieend    schedule 31.05.2011
comment
@vnshetty Нет, это все еще не сработало :(   -  person dieend    schedule 31.05.2011
comment
@dieend предоставьте свой собственный вид   -  person vnshetty    schedule 31.05.2011
comment
@vnshetty конструктор? Я добавил это.   -  person dieend    schedule 31.05.2011
comment
@dieend, извини, я не понял, чего тебе не хватает. вам лучше отлаживать свой код с помощью точек останова. ваше пользовательское представление должно быть инициализировано, когда ваш setContentView будет выполнен...   -  person vnshetty    schedule 31.05.2011
comment
@dieend Покажи нам свой логарифм, чтобы мы могли лучше отследить, в чем проблема.   -  person Dinash    schedule 31.05.2011


Ответы (3)


Ваша строка должна выглядеть так:

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

вы передаете идентификатор макета, а не созданного вами представления.

Остальная часть вашего кода выглядит нормально

person fleetway76    schedule 31.05.2011
comment
Ах, извините. Я опечатался. Это действительно так, как вы написали. Но нет, gameView по-прежнему нулевой. :( - person dieend; 31.05.2011
comment
Почему вы должны полностью квалифицировать указатель this для вызова Jembalang.this.findViewById? вы делаете вызов того же объекта, к которому вы добавили представление? - person fleetway76; 31.05.2011
comment
GameView реализует Runnable, и мне нужно его запустить, поэтому мне нужно снова вызвать его - person dieend; 31.05.2011

Я не знаю, что такое Jembalang, но я думаю, вам следует удалить это.

gameView = (GameThread) findViewById(R.id.game_view);
person Jarno Argillander    schedule 14.11.2011

Вы говорите, что ваш файл макета называется "example.xml", но вы вызываете setContentView(R.layout.cobagabung). Таким образом, ваше представление инициализируется из "cobagabung.xml".

Убедитесь, что вы используете один и тот же идентификатор для имени файла макета и вызова setContentView, например

setContentView(R.layout.example);
person Orc JMR    schedule 04.09.2013