How to Extend Two Classes in Android?

17,967

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. Extending ListActivity only provides you with utility methods to work with the ListView, but you can totally have a ListView in an Activity without it being a ListActivity.
  • Create a utility class that contains extracted methods you need from MainActivity and call these methods from both your new class and MainActivity.
  • Modify MainActivity so that it extends ListActivity. After all it does contain a ListView (you'd loose the ActionBar thing, though).
Share:
17,967
AruLNadhaN
Author by

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, 2022

Comments

  • AruLNadhaN
    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 ??