Предыстория: ранее я спрашивал этот вопрос по аналогичной теме о том, как передать переменную экземпляра из класса Java в соответствующий файл макета в разработке для Android. Оказывается, нет простого способа сделать это, поэтому следующий вопрос — поиск хорошего способа, позволяющего xml-файлу и классу общаться друг с другом.
Вопрос. Я разрабатываю игру (почти закончил на Java Swing, теперь превращаю ее в приложение для Android). Он содержит несколько уровней, каждый с шахматной доской и шахматными фигурами разного размера - во всех смыслах и целях это приложение для шахматных головоломок, которое отображает новую головоломку на доске разного размера после того, как игрок решил предыдущую головоломку. Бизнес-логика завершена, но я работаю над графикой. В начале игры статический класс BoardFragment
(содержащийся в BoardContainer.class) с соответствующим XML-файлом макета fragment_board.xml
должен отображать размер доски (как GridLayout) и шахматные фигуры, соответствующие первому уровню, которые затем обновляются по мере завершения уровня. Для пояснения код выглядит примерно так (пропустите до конца, чтобы увидеть мою настоящую проблему):
//Here is BoardFragment.class, static class contained by BoardContainer:
public static class BoardFragment extends Fragment {
public BoardFragment() {
}
public int level=0;
public void buttonPressed(View view) {
//method that will advance the game and update "level"
//depending on which button was clicked
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_board,
container, false);
return rootView;
}
}
//This is fragment_board.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.exampletest.MainGame$BoardFragment" >
<android.support.v7.widget.GridLayout
xmlns:app="schemas.android.com/apk/res-auto"
android:id="@+id/gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:columnCount="4" >
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="49dp"
android:layout_height="49dp"
android:contentDescription="@null"
android:onClick="buttonPressed"
android:src="@drawable/grid11" />
</android.support.v7.widget.GridLayout>
</RelativeLayout>
Обратите внимание, что для простоты и пространства в XML-файле сейчас находится только одна кнопка изображения, но если app:columnCount равен 4, их будет 16. На самом деле число должно зависеть от переменной экземпляра «уровень» в соответствующем классе ( так что если level==5
, то, возможно, app:columnCount==6
и так далее), но я не уверен, как мне передать это из файла класса в xml. Это вообще возможно? На самом деле, когда уровень пройден, размер доски и количество фигур должны измениться. Следует ли это делать
Иметь один файл фрагмента xml для каждого уровня? Тогда предыдущий вопрос решен, но для многих уровней это приведет к большому количеству файлов фрагментов - это лучшая практика?
Иметь один XML-файл фрагмента, который обновляется по мере завершения уровня?
Я ценю любую помощь.
NullPointerException
в строке этой, это будет означать, чтоboardLayout
равно нулю, что означает, что у вас нетView
с идентификатором gridView в ресурсе макета сетки. 29.07.2014fragment_board.xml
действительно есть идентификатор GridView. Ноroot
вroot.findViewById
возвращает ошибку (не может получить символ), вы уверены, что он там? Я удалил его и добавилsetContentView(R.layout.fragment_board_grid)
раньше, так что теперь код компилируется и работает правильно, хотя таинственным образом я все еще получаю фатальную ошибку (вероятно, потому что этот код находится во фрагменте?). Если вы знаете в чем проблема, то было бы неплохо, а иначе без проблем, потому что тогда я задам еще один вопрос в сети. 29.07.2014setContentView()
используется для установки содержимогоActivity
, а неFragment
, поэтому вам следует вернуть исходный формат, если вы работаете внутриFragment
. 29.07.2014xmlns:app="schemas.android.com/apk/res-auto"
нужна в GridView в файле xml, по крайней мере, на моем компьютере). Однако приложение ведет себя не так, как ожидалось, посколькуCellView
выстроены в одну строку, а не заполняют доску для любых значенийcolumnsNum
иrowsNum
больше единицы. Вы знаете, почему это происходит? Приложение также вылетает при переходе из портретного режима в ландшафтный (и наоборот), но я надеюсь, что этой проблемы не возникнет, если я вставлю копии файлов xml в каталогиland
иport
. 30.07.2014GridLayout
в ресурсе макета (хотя вам нужно будет добавить префикс схемыhttp://
) - я просто скопировал XML из ваш вопрос. Я добавил динамическое распределение размеров строк/столбцов, что должно решить проблему однострочного макета (см. мое последнее редактирование кода). Я создал тестовое приложение в соответствии с кодом в моем ответе, и оно ведет себя правильно при изменении ориентации - вы должны опубликовать новый вопрос с подробностями о сбое и трассировке стека. 30.07.2014static
из класса BoardFragment, пытаясь заставить работатьsetContentView()
, а затем забыл вернуть его (что сделало его зависимым от класса BoardContainer). Теперь все работает как положено, дело закрыто! Меня интересует несколько других вещей, например, как по-разному определить макет в книжной и альбомной ориентации, но сначала я поиграю со слушателями и так далее, прежде чем задавать новый вопрос в сети. Спасибо. 30.07.2014