繁体   English   中英

Android-导航抽屉可实现活动更改

[英]Android - Navigation Drawer to implement activity changing

我已经阅读了很多有关实现导航抽屉以在片段之间进行更改的问题和教程。 对于这个问题,不需要这些实现,因为我希望从一项活动更改为另一项活动。

我已经实现了带有扩展ArrayAdapter<String>的自定义补充工具栏适配器。 这允许对导航抽屉实施我自己的样式。 请参见下面的第一个代码段。

public class SidebarAdaptor extends ArrayAdapter<String> {

    Context context;
    int layoutResourceId;
    String data[] = null;

    public SidebarAdaptor(Context context, int layoutResourceId, String[] data)
    {
        // Initiate the ArrayAdapter
        super(context, layoutResourceId, data);

        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ControlHolder holder;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new ControlHolder();
            TextView control = (TextView)row.findViewById(R.id.textItem);
            holder.control = control;

            row.setTag(holder);
        }
        else
        {
            holder = (ControlHolder)row.getTag();
        }

        String text = data[position];
        holder.control.setText(text);

        return row;
    }

    static class ControlHolder
    {
        TextView control;
    }

}

然后,在我的MainActivity类的onCreate函数中设置此适配器。 见下文。

private void customiseSidebar() {
        SidebarAdaptor sidebarAdaptor = new SidebarAdaptor(
                this,
                R.layout.side_bar_custom_row,
                new String[]{"Login", "Offline Access", "Register", "Forgotten Password"}
        );

        ListView listView1 = (ListView) findViewById(R.id.navList);

        listView1.setAdapter(sidebarAdaptor);
        listView1.setOnItemClickListener(new DrawerItemClickListener());
}

然后,一旦用户按下导航抽屉中的任何选项, DrawerItemClickListener类将保留要切换到的活动。 请参阅下面的最终代码段。

package ap.classes;

import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import ap.ForgottenPassword;
import apMainActivity;
import ap.OfflineAccess;
import ap.RegisterAccount;

public class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);

        }

            /** Swaps fragments in the main content view */
        private void selectItem(int position) {

            switch(position)
            {
                case 0:
                Intent intent = new Intent(MainActivity.this, OfflineAccess.class);
                startActivity(intent);
                break;
            case 1:
                Intent intent = new Intent(MainActivity.this, RegisterAccount.class);
                startActivity(intent);
                break;
            case 2:
                Intent intent = new Intent(MainActivity.this, ForgottenPassword.class);
                startActivity(intent);
                break;

        }
    }

现在,我似乎遇到了三个相当大的问题:

  1. 第一个是以下错误消息: MainActivity is not an enclossing class
  2. 第二个陈述是: Cannont resolve method startActivity in android.content.Intent
  3. 最终的问题是,当我单击NavigationDrawer中的任何内容时,抽屉就会关闭,而没有注册任何按键。

谢谢Stackoverflow。

首先解决前两个问题:

第一个是以下错误消息:MainActivity不是包围类

第二个陈述是: 无法在android.content.Intent中解析方法startActivity

根据您提供的代码,进行调用时您不在Activity类的范围内

Intent intent = new Intent(MainActivity.this, OfflineAccess.class);
startActivity(intent);

上面的内容告诉编译器调用方法DrawerItemClickListener.startActivity(Intent intent),但没有这样的方法。 相反,您应该传递活动实例并调用其startActivty方法。

第二个MainActivity不是由于使用MainActivity.this而不是传递上下文实例而引发的全类错误。

总结一下,您可以执行以下操作:

public class DrawerItemClickListener implements ListView.OnItemClickListener {

    private Activity mActivity;
    public DrawerItemClickListener(Activity activity){
        mActivity = activity;
    }

        /** Swaps fragments in the main content view */
    private void selectItem(int position) {

        switch(position)
        {
            case 0:
            Intent intent = new Intent(mActivity, OfflineAccess.class);
            mActivity.startActivity(intent);
            break;
        /.../

    }
}

是的,我也遇到过类似的问题。虽然片段带有导航抽屉,但使用Activity会很容易。 您必须创建一个自定义导航抽屉。 我给我个主意 enter code here

public class DrawerItemClickListener extends AppCompatActivity{

    private ListView mDrawerList;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private String mActivityTitle;
    private List<DrawerList> drawerListList;

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

        drawerListList = new ArrayList<>();
        mDrawerList = (ListView) findViewById(R.id.navList);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mActivityTitle = getTitle().toString();

        addDrawerItems();
        setupDrawer();
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();

    }

    protected abstract int getContentView();

    private void addDrawerItems() {
        drawerListList.add(new DrawerList("1", R.drawable.1));
        drawerListList.add(new DrawerList("2", R.drawable.2));
        drawerListList.add(new DrawerList("3", R.drawable.3));
        drawerListList.add(new DrawerList("4", R.drawable.4));
        drawerListList.add(new DrawerList("5", R.drawable.5));

        CustomDrawerAdapter adapter = new CustomDrawerAdapter(this, R.layout.list_view_menu, drawerListList);
        mDrawerList.setAdapter(adapter);

        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    if (id == 0) {
                        intent = new Intent(DrawerItemClickListener .this, FirstActivity.class);

                        startActivity(intent);
                        onDrawerClose();
                    } else if (id == 1) {
                        intent = new Intent(DrawerItemClickListener .this, SecondActivity.class);
                        startActivity(intent);
                        onDrawerClose();
                    } else if (id == 2) {

                        intent = new Intent(DrawerItemClickListener .this, ThirdActivity.class);

                        startActivity(intent);
                        onDrawerClose();
                    } else if (id == 3) {
                        intent = new Intent(DrawerItemClickListener .this, FouthActivity.class);
                        startActivity(intent);
                        onDrawerClose();
                    }
                }
            }
        });
    }

    private void setupDrawer() {
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getSupportActionBar().setTitle("Navigation!");
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getSupportActionBar().setTitle(mActivityTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

    public void onDrawerClose() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            onBackPressed();
        }
    }

    @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) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        // Activate the navigation drawer toggle
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

和自定义适配器在下面

public class CustomDrawerAdapter extends ArrayAdapter<DrawerList> {
    private Context context;
    private List<DrawerList> drawerItemList;
    private int layoutResID;

    public CustomDrawerAdapter(Context context, int layoutResourceID, List<DrawerList> listItems) {
        super(context, layoutResourceID, listItems);
        this.context = context;
        this.drawerItemList = listItems;
        this.layoutResID = layoutResourceID;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        DrawerItemHolder drawerHolder;
        View view = convertView;

        if (view == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            drawerHolder = new DrawerItemHolder();

            view = inflater.inflate(layoutResID, parent, false);
            drawerHolder.ItemName = (TextView) view.findViewById(R.id.drawer_itemName);
            drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);

            view.setTag(drawerHolder);

        } else {
            drawerHolder = (DrawerItemHolder) view.getTag();
        }

        DrawerList dItem = this.drawerItemList.get(position);
        drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getMenuImage()));
        drawerHolder.ItemName.setText(dItem.getMenuName());

        return view;
    }

    private static class DrawerItemHolder {
        TextView ItemName;
        ImageView icon;
    }
}

然后从每个活动中扩展它,例如

public class FirstActivity extends DrawerItemClickListener {
..
}

并且每个XML布局中都添加了Listview。 希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM