2011-12-15 3 views
2

Я пытаюсь внедрить некоторый код для каждого действия и не хочу копировать и переводить код в каждое действие.Использование интерфейса для реализации кода во всех действиях

Первоначально у меня была родительская активность с кодом, а затем расширены все остальные, но я не мог этого сделать в ListActivities или ExpandableListActivities.

Я думаю, что это будет сделано с использованием класса интерфейса, после чего каждый из них реализует это. Однако, когда я пытаюсь сделать это, Eclipse дает мне ошибку и говорит, чтобы удалить тело метода.

Вот то, что я до сих пор

import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.Toast; 

public interface MenuOptions { 

    /** 
    * Method called when the hardware menu button is called. Uses optionmenu.xml for layout 
    */ 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.optionmenu, menu); 
     return true; 
    } 

    /** 
    * Event listener for the options menu. If home is pressed user is sent to home screen. If settings is pressed user is sent to setting screen 
    * User is passed as an extra 
    */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Intent nextIntent = null; 

     switch (item.getItemId()) { 
      case R.id.home:  
         Toast.makeText(this, "You pressed the icon!", Toast.LENGTH_LONG).show(); 
         nextIntent = new Intent(this, Home.class); 

         break; 
      case R.id.settings:  
         Toast.makeText(this, "You pressed the text!", Toast.LENGTH_LONG).show(); 
         nextIntent = new Intent(this, Settings.class); 
         break; 

     } 

     nextIntent.putExtra("user", user); 
     startActivity(nextIntent); 
     return true; 
    } 

} 
+0

Хороший вопрос, я бы хотел узнать интересные ответы. –

ответ

2

Interface классы в Java должен содержать только сигнатуры методов и не реализации. Поэтому вы должны создать базовый класс:

public class MenuOptions extends Activity { 
    /** 
    * Method called when the hardware menu button is called. Uses optionmenu.xml for layout 
    */ 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.optionmenu, menu); 
     return true; 
    } 

    /** 
    * Event listener for the options menu. If home is pressed user is sent to home screen. If settings is pressed user is sent to setting screen 
    * User is passed as an extra 
    */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Intent nextIntent = null; 

     switch (item.getItemId()) { 
      case R.id.home:  
         Toast.makeText(this, "You pressed the icon!", Toast.LENGTH_LONG).show(); 
         nextIntent = new Intent(this, Home.class); 

         break; 
      case R.id.settings:  
         Toast.makeText(this, "You pressed the text!", Toast.LENGTH_LONG).show(); 
         nextIntent = new Intent(this, Settings.class); 
         break; 

     } 

     nextIntent.putExtra("user", user); 
     startActivity(nextIntent); 
     return true; 
    } 
} 

И вашу активность:

public class YourActivity extends MenuOptions { 
/*...*/ 
} 
+0

Привет, спасибо за ответ, но это решение по-прежнему означает, что у меня есть три активности с почти точно таким же кодом для Activities, ListActivities и ExplandableListActivities. – TrueWheel

0

Интерфейсы не разрешено иметь метод тела. Это связано с тем, что он описывает интерфейс объекта объекта, а не самого метода.

Проблема с теми же параметрами меню, которые разделяют все действия, является общей. Самый простой способ справиться с этим - определить 2 или 3 суперкласса (для ListActivities и MapActivities).

+0

Привет, спасибо за ваш ответ. Похоже, это может быть ответ, который он просто чувствует очень неуклюжим. – TrueWheel

0

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

Я бы сказал, что лучше всего создать новый класс, который могут использоваться всеми вашими действиями для выполнения той же работы. Затем вам понадобится экземпляр этого класса, который создается и инициализируется каждым действием onCreate (или где-то еще)

В качестве альтернативы вы можете обнаружить, что вы можете создать новый статический класс, поэтому вам не нужно создавать экземпляр, просто вызовите статический метод в нужное время

Другой способ сделать это - создать подкласс Activity, который включает стандартное поведение и создать все ваши действия в качестве подкласса этого. Если у вас есть ListActivities (например), вам нужно будет сделать некоторую перекодировку, сделав их подклассовыми действиями, содержащими списки