How to Extend Two Classes in Android?
Solution 1
In Java you can't extend multiple classes, and for a good reason. Take for example what you are trying to accomplish by extending MainActivity
and ListActivity
. In your new class, when you call:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
...
}
Which onCreate() are you overriding? The one from ListActivity
, or the one from MainActivity
?
What the link you posted is saying is that instead of inheriting from another object, you compose your new object of the one you are trying to use. For example:
public class NewClass extends OldClass1 {
private OldClass2 mOldClass2 = new OldClass2();
@Override
public methodFromOldClass1() {
}
public methodFromOldClass2() {
mOldClass2.methodFromOldClass2();
}
}
The problem with this approach is that the methods from MainActivity
and ListActivity
are still going to have the same name, which although you can work around, it will become a headache quickly.
So the problem is a result of how you designed your class hierarchy. You will need to think about what functions you need from MainActivity
, and what functions from ListActivity
and choose how to reimplement your objects.
My Suggestion, since ListActivity
only makes it slightly easier to work with lists (not that much easier) you can just skip it and implement the code related to the list on your own, and that way you can just extend MainActivity
Solution 2
You need to start by identifying what parts of MainActivity
you need to inherit from, and what do you need from ListActivity
.
Then, you have various possibilities:
- Trivially, not extending
ListActivity
. ExtendingListActivity
only provides you with utility methods to work with theListView
, but you can totally have aListView
in anActivity
without it being aListActivity
. - Create a utility class that contains extracted methods you need from
MainActivity
and call these methods from both your new class andMainActivity
. - Modify
MainActivity
so that it extendsListActivity
. After all it does contain aListView
(you'd loose theActionBar
thing, though).
AruLNadhaN
Hey, This is My App Remote iT: https://play.google.com/store/apps/details?id=me.arulnadhan.remoteit.free Remote iT Plus: https://play.google.com/store/apps/details?id=me.arulnadhan.remoteit.plus Contact Me: http://arulnadhan.me/ #SOreadytohelp
Updated on June 04, 2022Comments
-
AruLNadhaN almost 2 years
I need to extend Two classes from a Single Class.My class Wants to extend Both ListActivity & MainActivity.
I found a question similar to this. But i don't know how to Implement this https://stackoverflow.com/a/5836735/2781359
Thanks for your Help.
The Class which has to be Extended is ConnectionEditActivity.
public class ConnectionEditActivity extends ListActivity implements OnClickListener { public static Connection connectionParam; private Connection connection; private Button save; private EditText name; private EditText password; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.connection = connectionParam; this.save = (Button) this.findViewById(R.id.save); this.save.setOnClickListener(this); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) { // Don't need the Save button on newer devices android.widget.LinearLayout.LayoutParams a = (LayoutParams) this.save.getLayoutParams(); a.height = 0; this.save.setLayoutParams(a); this.save.forceLayout(); } this.name = (EditText) this.findViewById(R.id.name); this.password = (EditText) this.findViewById(R.id.password); } @Override public boolean onCreateOptionsMenu(android.view.Menu menu) { // Inflate the menu items for use in the action bar android.view.MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.connection_edit_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(android.view.MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_save: this.finish(); return true; default: return super.onOptionsItemSelected(item); } } protected void onResume() { super.onResume(); this.name.setText(this.connection.getName()); this.password.setText(this.connection.getPassword()); } protected void onPause() { super.onPause(); this.connection.setName(this.name.getText().toString()); this.connection.setPassword(this.password.getText().toString()); finish(); } public void onClick(View v) { if (v == this.save) { this.finish(); } } }
Mainactivity
public abstract class MainActivity extends ActionBarActivity { protected ListView mDrawerList; protected DrawerLayout mDrawer; private CustomActionBarDrawerToggle mDrawerToggle; private String[] menuItems; String LOG_TAG = "Remote It"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR); // getSupportActionBar().hide(); setContentView(R.layout.activity_main_drawer); // enable ActionBar app icon to behave as action to toggle nav drawer getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); // set a custom shadow that overlays the main content when the drawer // opens mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); _initMenu(); mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer); mDrawer.setDrawerListener(mDrawerToggle); } private void _initMenu() { NsMenuAdapter mAdapter = new NsMenuAdapter(this); // Add Header mAdapter.addHeader(R.string.ns_menu_main_header); // Add first block menuItems = getResources().getStringArray(R.array.ns_menu_items); String[] menuItemsIcon = getResources().getStringArray(R.array.ns_menu_items_icon); int res = 0; for (String item : menuItems) { int id_title = getResources().getIdentifier(item, "string", this.getPackageName()); int id_icon = getResources().getIdentifier(menuItemsIcon[res], "drawable", this.getPackageName()); NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon); // if (res==1) mItem.counter=12; //it is just an example... // if (res==3) mItem.counter=3; //it is just an example... mAdapter.addItem(mItem); res++; } // Second Block mAdapter.addHeader(R.string.ns_menu_main_header2); menuItems = getResources().getStringArray(R.array.ns_menu_itemss); String[] menuItemsIcons = getResources().getStringArray(R.array.ns_menu_items_iconss); int ress = 0; for (String item : menuItems) { int id_title = getResources().getIdentifier(item, "string", this.getPackageName()); int id_icon = getResources().getIdentifier(menuItemsIcons[ress], "drawable", this.getPackageName()); NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon); // if (res==1) mItem.counter=12; //it is just an example... // if (res==3) mItem.counter=3; //it is just an example... mAdapter.addItem(mItem); res++; } mDrawerList = (ListView) findViewById(R.id.drawer); if (mDrawerList != null) mDrawerList.setAdapter(mAdapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { /* * The action bar home/up should open or close the drawer. * ActionBarDrawerToggle will take care of this. */ if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle your other action bar items... return super.onOptionsItemSelected(item); } private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle { public CustomActionBarDrawerToggle(Activity mActivity, DrawerLayout mDrawerLayout) { super(mActivity, mDrawerLayout, R.drawable.ic_drawer, R.string.ns_menu_open, R.string.ns_menu_close); } @Override public void onDrawerClosed(View view) { getSupportActionBar().setTitle(getString(R.string.ns_menu_close)); supportInvalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle(getString(R.string.ns_menu_open)); supportInvalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mDrawer.closeDrawer(mDrawerList); switch (position) { case 1: Intent a = new Intent(MainActivity.this, Home.class); startActivity(a); break; case 2: Intent ac = new Intent(MainActivity.this, ConnectionListActivity.class); startActivity(ac); break; default: } }
EDIT
I need to Extend it.Because the MainActivity has the navigation drawer.Now ConnectionEditActivity doesn't shows the navigationDrawer nor the ActionBar .But i need to show the ActionBar
Any Suggestions ??