我正在制作的应用程序存在一个小难题。基本上,该应用程序用于游戏,以显示游戏中每个生物的信息。游戏中至少有30个生物,所以我为每个生物制作了一个类和布局文件,因此我可以为每个生物显示不同的信息。我问的问题是,有没有办法让我有一个静态类文件,当我点击一个按钮去找一个生物时页面,而不是为那个生物创建一个完整的类和布局文件,它只会将一个静态类中的所有字符串更改为我需要的信息?我是Java编程的新手,所以我只知道一些事情。我只是想让代码更清洁一点。谢谢你的帮助!
这是Creature的一个类文件(其中有20多个绝对没有任何内容)。这是Bat.java的一个例子:
public class Bat extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String userTheme = prefs.getString("theme", "main");
if (userTheme.equals("main"))
setTheme(R.style.MainTheme);
else if (userTheme.equals("light"))
setTheme(R.style.HoloLight);
else if (userTheme.equals("lightdark"))
setTheme(R.style.HoloLightDark);
else if (userTheme.equals("dark"))
setTheme(R.style.HoloTheme);
setContentView(R.layout.bat);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
inflater.inflate(R.menu.options, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.statistics:
Intent intent0 = new Intent(Bat.this, Statistics.class);
startActivity(intent0);
return true;
case R.id.funfacts:
Intent intent1 = new Intent(Bat.this, FunFacts.class);
startActivity(intent1);
return true;
case R.id.home:
Intent intent2 = new Intent(Bat.this, Home.class);
startActivity(intent2);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
生物的真实信息依赖于我的xml文件(我也有20多个)以下是Bat.xml的一个例子
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="144dp"
android:src="@drawable/batmc" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Overview"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bats are the second smallest mob in the game. They will spawn only in large caves, or with a spawn egg. They may also spawn in a house, considering its dark, and big enough."
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:visibility="invisible" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Behavior"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bats sleep during the day, and become active at night. While idle, a bat will hang upside down until a player approaches, which it will then fly away. They cannot hang on non-solid or transparent blocks. If you place a bat in a minecart, it will move the minecart on its own."
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:visibility="invisible" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drops"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="None"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:visibility="invisible" />
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TextView
android:layout_column="1"
android:text="Spawn - Light level 10 or less"
android:padding="3dip"
android:gravity="left"
android:textSize="18dip" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TextView
android:layout_column="1"
android:text="Health - 6"
android:padding="3dip"
android:textSize="18dip" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TextView
android:layout_column="1"
android:text="First Appearance - 12w28a"
android:padding="3dip"
android:textSize="18dip" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_column="1"
android:text="Network ID - 65"
android:padding="3dip"
android:textSize="18dip" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
</TableLayout>
</LinearLayout>
</ScrollView>
答案 0 :(得分:0)
您只需要遵循“工厂模式”。从任何地方挑选和示例,并相应地修改您的代码。您可以编写一个抽象工厂类,并可以根据需要进行扩展。
答案 1 :(得分:0)
如何使用WebKit浏览器和html页面进行一项活动?你可以拥有一个完整的'Gameopaedia'那里有生物,派系等等。也许你可以为此完成一项活动。
然后,如果你只有3个屏幕统计,FunFacts和Home,如果它们显示相同的数据,我只会做3个活动并以某种方式参数化。
查看this answer参与传递到已启动活动的参数。
答案 2 :(得分:0)
首先要使您的xml文件可重用,您应该删除所有硬编码字符串,如:
android:text="Bats sleep during the day, and become active at night. While idle, a bat will hang upside down until a player approaches, which it will then fly away. They cannot hang on non-solid or transparent blocks. If you place a bat in a minecart, it will move the minecart on its own."
你应该把这样的字符串放在数据库中,或者如果你不想要db,你可以在你的project / res / values中找到strings.xml文件。这样做你的xml文件将是一个可重复使用的void结构,用于显示许多生物类。然后,您将使用类似setText(String string)
的方法从Bat.java类中动态注入creatures.xml中的相应字符串。
对于java类的可重用性,问题更复杂,因为我真的不知道你的想法。我建议你使用一个抽象类来实现你所有类的所有常用方法,如:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String userTheme = prefs.getString("theme", "main");
if (userTheme.equals("main"))
setTheme(R.style.MainTheme);
else if (userTheme.equals("light"))
setTheme(R.style.HoloLight);
else if (userTheme.equals("lightdark"))
setTheme(R.style.HoloLightDark);
else if (userTheme.equals("dark"))
setTheme(R.style.HoloTheme);
setContentView(R.layout.creature_info_structure);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
inflater.inflate(R.menu.options, menu);
return true;
}
进一步尝试设计自己的项目对我来说是不可能的。我唯一能做的就是 建议你阅读一些关于多态性和继承的东西,这是OO编程的两个原则,它将帮助你设计和开发你的项目。 希望我能把你带到正确的方向。
答案 3 :(得分:0)
我只有一个本地数据库(或只是一个本地JSON文件),其中包含每个生物的数据。然后,创建两个fragments。其中一个将是您的主片段,另一个将是您的详细信息片段。
对于主分段,您可能希望子类ListFragment以便获得列表功能。然后创建一个ArrayAdapter将数据库中的生物提供给列表片段。
对于细节片段,创建将显示所选生物的详细信息的字段。现在这里有一个巧妙的技巧:因为这些是碎片,你可以优化手机和平板电脑的用户界面。在手机上,您首先只显示主分段,然后等到用户单击以将其与详细信息片段交换。现在,在平板电脑上,您可以并排显示主片段和细节片段:用户可以选择左侧的生物并查看右侧的详细信息。
当用户选择某个生物时(无论您是在手机还是平板电脑上),您都会使用所选生物的数据填充详细信息片段。您可以通过加载JSON或数据库条目,然后为每个小部件设置内容。
有关详细信息,请务必查看此培训课程:Building a Dynamic UI with Fragments。