gpt4 book ai didi

java - Android开发中类与xml布局的通信

转载 作者:行者123 更新时间:2023-11-29 03:18:38 27 4
gpt4 key购买 nike

背景:我之前问过this关于如何将实例变量从 Java 类传递到它在 Android 开发中相应的布局文件的类似主题的问题。事实证明没有简单的方法可以做到这一点,所以下面是一个后续问题,寻找让 xml 文件和类相互对话的好方法。

问题:我正在开发一款游戏(在 Java Swing 中已接近完成,现在正在将其转换为 Android 应用程序)。它包含多个级别,每个级别都有不同大小的棋盘和棋子 - 出于所有 Intent 和目的,它是一个国际象棋拼图应用程序,在玩家解决了前一个拼图后,它会在不同大小的棋盘上显示一个新拼图。业务逻辑已完成,但我正在处理图形。在游戏开始时,静态类 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 fragment 文件?那么前面的问题就解决了,但是对于很多关卡,会导致很多 fragment 文件——这是最好的做法吗?

  • 有一个 fragment xml 文件会随着关卡的完成而更新吗?

感谢任何帮助。

最佳答案

如其他答案中所述,您需要在运行时动态地为您的电路板创建布局。但是,您仍然可以在 XML 布局资源中定义您的个人 View 及其属性,从而保留它们提供的将布局的非必要部分与代码分离并允许自动解析配置的优势-特定布局。

例如,您的布局可以调整为将电路板和单元格布局的布局资源分开:

fragment_board_grid.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
android:id="@+id/gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</RelativeLayout>

fragment_board_cell.xml

<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="49dp"
android:layout_height="49dp"
android:contentDescription="@null"
android:onClick="buttonPressed"
android:src="@drawable/grid11"
tools:context="com.example.exampletest.MainGame$BoardFragment" />

这些现在可以动态膨胀以创建板:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_board_grid,
container, false);
GridLayout boardLayout = (GridLayout) rootView.findViewById(
R.id.gridView);
boardLayout.setColumnCount(columnsNum);
boardLayout.setRowCount(rowsNum);
for (int columnIndex = 0; columnIndex < columnsNum; columnIndex++) {
for (int rowIndex = 0; rowIndex < rowsNum; rowIndex++) {
ImageView cellView = (ImageView) inflater.inflate(
R.layout.fragment_board_cell, boardLayout, false);
// Here you can customize it, add listeners, etc.
boardLayout.addView(cellView);
}
}
return rootView;
}

开始下一关后,您需要从头开始重新设计电路板布局。您可以通过两种方式解决这个问题:

  1. 让您的 Fragment 的每个实例代表一个特定的板。这将使 Fragment 逻辑非常简单并且只关注一个游戏级别。开始新关卡的逻辑将由它的 Activity 处理,方法是用新实例替换现有的 Fragment。这还有一个优势,那就是让开始新关卡的动画非常容易实现,因为 FragmentTransaction 本身就支持动画。

  2. Fragment 处理所有事情。这可以通过创建一个通用方法来实现,该方法将按需膨胀新的电路板布局并从onCreateView() 回调,然后实现一个方法,该方法将从其父级中删除当前的 Fragment 布局,并将其替换为由 board-inflating 方法生成的新布局。布局根可以从 getView() 方法获取(或者在支持库的情况下它是第一个 child ,因为库包装了初始的 Fragment 布局以阻止View 状态不会被 Activity 保存)。

关于java - Android开发中类与xml布局的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com