#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);