Как вызвать из метода класса supper в подклассе?

#java #android #methods #fragment

#java #Android #методы #фрагмент

Вопрос:

Как из класса BasicActivity вызвать метод stackAFragment из подкласса Sub?

Я хочу иметь возможность заменить фрагмент в моем подразделе Activity из любого Activity, который расширяет BasicActivity, с помощью menu. Я собираюсь создать метод в Sub для каждого пункта меню. Вот простой пример, как я это вижу:

 public class BasicActivity extends FragmentActivity {   
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.m_main, menu);
      return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
      case R.id.stad:
        TabHost tabHost = (TabHost) getParent().findViewById(android.R.id.tabhost);
        tabHost.setCurrentTab(4); //here is me Sub.class
        //How to call method stackAFragment here?
      break;
      default:
         return false;      
    }
    return true;
  }
}
  

Подкласс:

     public class Sub extends BasicActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);        
    }

    public void stackAFragment() {
        Fragment f = new StadFr();      
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.the_frag, f);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    }
}
  

Ответ №1:

Создайте переопределяемый метод в BasicActivity (например, с пустой реализацией) и переопределите его Sub .

 public class BasicActivity extends FragmentActivity {   

    protected void onTabChanged(){ }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
          case R.id.stad:
            TabHost tabHost = (TabHost) getParent().findViewById(android.R.id.tabhost);
            tabHost.setCurrentTab(4); //here is me Sub.class
            onTabChanged();
      break;
      default:
         return false;      
    }
    return true;
}

public class Sub extends BasicActivity {

    protected void onTabChanged() { stackAFragment(); }

   ....
}
  

Ответ №2:

Вы можете заставить свой BasicActivity класс реализовать метод stackAFragment() и переопределить его в своем подклассе. Вы также можете объявить абстрактный метод в своем BasicActivity , который затем также станет абстрактным классом.

Ответ №3:

super.stackAFragment() . Но этот метод должен быть определен в вашем BasicActivity . Он может быть абстрактным, если вы хотите.

Ответ №4:

Это должно предоставить вам желаемую функциональность:

 Activity activity = getLocalActivityManager().getActivity( tabHost().getCurrentTabTag() );     
if( activity instanceof Sub )
  ((Sub) activity).stackAFragment();