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

#android #view #android-layout #android-xml #android-custom-view

#Android #Вид #android-макет #android-xml #android-пользовательский вид

Вопрос:

Итак, у меня есть 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?

Комментарии:

1. вы на самом деле используете полный пакет?

2. используйте тег слияния вместо линейного макета на верхнем уровне

3. @Jinda эм, да, я смотрю на developer.android.com/resources/samples/ApiDemos/res/layout … и это дает полный пакет.

4. @vnshetty Нет, это все еще не сработало : (

5. @dieend извини, я не понимаю, чего тебе не хватает. вам лучше отлаживать свой код с помощью точек останова. ваш пользовательский вид должен быть инициализирован при запуске setContentView…

Ответ №1:

Ваша строка должна гласить:

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

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

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

Комментарии:

1. Ах, извините. Я ввел его с ошибкой. На самом деле это похоже на то, что вы написали. Но нет, GameView по-прежнему равен нулю.:(

2. Почему вы должны полностью квалифицировать свой указатель this для вызова Jembalang.this.findViewById? вы выполняете вызов того же объекта, к которому добавили представление?

3. В 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);