2013-08-05 2 views
0

У меня есть небольшая дилемма с приложением, которое я делаю. В основном, приложение предназначено для игры, для отображения информации о каждом существе в игре. В игре есть не менее 30 существ, поэтому я создал файл класса и макета для каждого существа, чтобы я мог отображать различную информацию для каждого из них. Вопрос, который я задаю, заключается в том, есть ли у меня способ иметь один статический файл класса и когда я нажимал кнопку, чтобы перейти на страницу одного существа, вместо того, чтобы создавать целый класс и файл макета для этого существа, это просто изменит все строки в одном статическом классе на нужную мне информацию? Я очень новичок в программировании на Java, поэтому знаю только несколько вещей. Я просто хотел сделать код немного чище. Спасибо за помощь!Как сократить количество классов в приложении для Android

Это одно из файлов классов существа (более 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

Вы могли бы показать код? – nio

+0

Просто добавил несколько примеров – user1798956

ответ

0

Вам просто нужно следовать «Factory Pattern». Выберите и пример из любого места и соответствующим образом измените свой код. Вы можете написать абстрактный заводский класс и продлить его в соответствии с вашими потребностями.

0

Как сделать одно действие с браузером WebKit и html-страницами внутри? У вас может быть целая «Генопадия» там со списком существ, фракций. Возможно, вы могли бы справиться с этим только одним действием.

Затем, если у вас есть только 3 экрана Статистика, FunFacts и Home, и если они отображают одни и те же данные, я бы сделал всего 3 действия и как-то их параметризую.

Отъезд this answer для параметра, передаваемого в запущенную активность.

+0

Ну, проблема в том, что я не могу использовать HTML-страницы внутри, потому что вся информация о существах находится в TextView в 20-х XML-файлах. Поэтому я не думаю, что HTML-представление поможет. Разве нет только способа иметь один класс и один файл макета, и в зависимости от того, какое существо я нажал, он изменит TextView в этом файле макета в соответствии с существом, которое я нажал? Должен быть какой-то способ сделать это! – user1798956

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." 

Вы должны поместить строки, как, что в базе данных или, если и не хотите дб , в файле strings.xml u можно найти в ваших проектах/res/values. Выполнение этого вашего xml-файла будет структурой пустот, многократно используемой для отображения многих классов существ. Затем u будет динамически вводить из класса Bat.java соответствующие строки в creatures.xml с использованием метода, такого как setText(String string).

Для повторного использования класса 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, которые помогут вам в разработке и разработке вашего проекта. Надеюсь, я поставил вас в правильном направлении.

0

Я бы просто имел локальную базу данных (или просто локальный файл JSON) с данными для каждого существа. Затем создайте два fragments. Один из них будет вашим основным фрагментом, а другой - фрагментом вашей информации.

Для главного фрагмента вы, вероятно, захотите получить подкласс ListFragment, чтобы получить функциональность списка. Затем сделайте ArrayAdapter, чтобы прокормить существ из вашей базы данных в фрагмент списка.

Для фрагмента детали создайте поля, в которых будут отображаться сведения о выбранном существе. Теперь вот аккуратный трюк: поскольку это фрагменты, вы можете оптимизировать свой интерфейс для телефонов и планшетов. На телефонах сначала отображается только мастер-фрагмент, и дождитесь, пока пользователь нажмет кнопку для его замены фрагментом деталей. Теперь на планшете вы показываете фрагмент мастера и фрагмент деталей бок о бок: пользователь может выбрать существо слева и увидеть детали справа.

Когда пользователь выбирает существо (независимо от того, находитесь ли вы на телефоне или планшете), вы заполняете фрагмент детали данными для выбранного существа. Вы делаете это, загружая свой JSON или запись базы данных, а затем устанавливаете контент для каждого виджета.

Для получения дополнительной информации ознакомьтесь с этим учебным курсом: Building a Dynamic UI with Fragments.

Смежные вопросы