如何在Android中扩展两个类?

时间:2014-01-30 14:59:58

标签: java android class extends

我需要从Single Class扩展两个类。我的类要扩展ListActivity和amp; MainActivity。

我发现了类似的问题。 但我不知道如何实施这个https://stackoverflow.com/a/5836735/2781359

感谢您的帮助。

必须扩展的类是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:
            }

        }

修改

我需要扩展它。因为MainActivity有导航抽屉。现在ConnectionEditActivity 没有显示navigationDrawer也没有显示ActionBar。但是我需要显示ActionBar
任何建议??

2 个答案:

答案 0 :(得分:2)

在Java中,您无法扩展多个类,并且有充分的理由。以扩展MainActivityListActivity为例,您可以尝试实现的目标。在您的新班级中,当您致电:

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

你最重要的是onCreate()?来自ListActivity的那个,或来自MainActivity的那个?

您发布的链接是说,您不是从另一个对象继承,而是组合您尝试使用的对象的新对象。例如:

public class NewClass extends OldClass1 {

   private OldClass2 mOldClass2 = new OldClass2();

   @Override
   public methodFromOldClass1() {
   }

   public methodFromOldClass2() {
       mOldClass2.methodFromOldClass2(); 
   }

}

这种方法的问题在于MainActivityListActivity的方法仍然具有相同的名称,尽管你可以解决这个问题,但它很快就会变得很头疼。

因此问题是您设计类层次结构的结果。您需要从MainActivity考虑所需的功能,以及ListActivity中的哪些功能,并选择如何重新实现对象。

我的建议,因为ListActivity只使得使用列表稍微容易一点(不是那么容易),你可以跳过它并自己实现与列表相关的代码,这样你就可以延长MainActivity

答案 1 :(得分:1)

您需要首先确定需要继承的MainActivity部分,以及ListActivity需要什么。

然后,您有各种可能性:

  • 平凡,不延伸ListActivity。扩展ListActivity仅为您提供了使用ListView的实用方法,但您可以在ListView中完全拥有Activity而不是ListActivity
  • 创建一个实用程序类,其中包含您需要从MainActivity中提取的方法,并从新类和MainActivity调用这些方法。
  • 修改MainActivity,使其扩展ListActivity。毕竟它确实包含ListView(你放弃了ActionBar的东西。)