如何缩短Android应用程序中的类数量

时间:2013-08-05 07:54:48

标签: android xml class

我正在制作的应用程序存在一个小难题。基本上,该应用程序用于游戏,以显示游戏中每个生物的信息。游戏中至少有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>

4 个答案:

答案 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