2014-03-11 3 views
2

У меня возникла проблема с приложениями для Android-приложений. Я сделал baseActivity, который является базой других приложений и других приложений.Активность наследования на Android (базовая - основная деятельность)

Это мой код.

Во-первых, BaseActivity.java

public class BaseActivity extends Activity { 

    protected void onCreate(Bundle savedInstanceState,int layoutId) { 
     super.onCreate(savedInstanceState); 
     setContentView(layoutId); 

     Button menuBtn = (Button)findViewById(R.id.menuBtn); 
     menuBtn.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.d("bss","menu"); 
      } 
     }); 
    } 
} 

И другая является MainActivity.java

public class MainActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState,R.layout.activity_main); 
     setContentView(R.layout.activity_main); 

    } 
} 

Теперь у меня есть вопрос! Когда я нажал кнопку меню, нажмите кнопку прослушивания не действовал. Он не печатал сообщения журнала и никаких действий. Итак, у меня есть проблема с моей заявкой. Связано ли это с жизненным циклом или как я могу решить проблему.

ответ

1

Код дважды устанавливает представление содержимого. Ниже приведена последовательность вашего кода.

  1. setContentView()
  2. Add button listener
  3. setContentView()

Заявление # 2, добавляет кнопку слушателя и все это хорошо до сих пор. Но как только вы сбросите представление содержимого в инструкции № 3, предыдущие настройки будут недействительными. И кнопка повторно инициализируется, и onClickListener больше не привязан к кнопке.

+0

прохладный. ваше объяснение так хорошо. – WitchOfCloud

+0

Спасибо @WitchOfCloud –

0

Удалите contentview из BaseActivity и положить

Button menuBtn = (Button)findViewById(R.id.menuBtn); 
     menuBtn.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.d("bss","menu"); 
      } 
     }); 

в MainActivity. Базовый актив должен быть подклассом SuperClass и MainActivity, все действия для просмотра shold должны быть инициализированы в подкласс.

2

мне не нравится, как вы заставляете вещи, по-прежнему, если вы хотите сделать это работает таким образом, вы должны удалить setContentView(R.layout.activity_main); из MainActivity, это потому, что тот, который вы звоните снова setContentView(R.layout.activity_main); в sublcass, иерархия представления для этого Activity будет воссозданы недействительности то, что вы сделали в супер классе

+3

прохладный. Не могли бы вы сами объяснить причину падения? – Blackbelt

+0

Спасибо. Я решил свою проблему! Круто! Однако почему так не нравится? – WitchOfCloud

+0

, потому что вы меняете обратный вызов onCreate в 'BaseActivity' – Blackbelt

0

Попробуйте это:

public class BaseActivity extends Activity { 

      protected void onCreate(Bundle savedInstanceState,int layoutId) { 
       super.onCreate(savedInstanceState); 



      } 

     public int getLayoutXML() { 
      return -1; 
     } 

     public abstract int getMenuId(); 
     } 

После этого использования этого BaseActivity класса, как это:

public class service_detail extends BaseActivity { 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

      // Use button like this: 
Button menuBtn = (Button)findViewById(R.id.menuBtn); 
     menuBtn.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.d("bss","menu"); 
      } 
     }); 

} 

    @Override 
     public int getMenuId() { 
      // TODO Auto-generated method stub 
      return 1; 
     } 

     @Override 
     public int getLayoutXML() { 
      // TODO Auto-generated method stub 
      return R.layout.service_detail; 
     } 

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