【问题标题】:Android - Navigation Drawer to implement activity changingAndroid - Navigation Drawer 实现活动更改
【发布时间】:2017-10-26 03:10:43
【问题描述】:

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

我已经实现了一个自定义侧边栏适配器扩展 ArrayAdapter<String>。这允许实现我自己的样式到我的导航抽屉。见下面第一个代码sn-p。

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 类会保存用户按下导航抽屉中的任何选项后要切换到的活动。看下面的最终代码sn-p。

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。

【问题讨论】:

标签: java android android-activity


【解决方案1】:

先修复前两个问题:

首先是以下错误消息:MainActivity 不是封闭类

第二个声明它;无法解析 android.content.Intent 中的方法 startActivity

根据您提供的代码,您在拨打电话时不在 Activity 类的范围内

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

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

第二个 MainActivity is not an enclossing class 由于使用 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;
        /.../

    }
}

【讨论】:

  • 谢谢。现在已解决此问题,但我的 OP 中的第一条语句仍然存在问题。任何想法为什么?
  • 修复第三期,见 OP 中的评论。
【解决方案2】:

是的,我也遇到过类似的问题。虽然 Fragments 带有导航抽屉,但使用 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。 希望对您有所帮助。

【讨论】:

  • 所有这些代码都是完全必要的吗?另外,我很难理解其中的每一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多