问题描述
我创造了一个抽屉式导航与它内部的RecyclerView。我已经学会了从YouTube。但是我不得不实施一个onNavigationDrawerItemSelected的方法为它烦恼。我想要做的是为用户能够点击列表中的项目,这将它们定位到一个活动,而不是一个片段。
我是新来的Android编程,所以我理解codeS坏。我到处找的在线教程,如下面的链接,但它是行不通的。我花了很多时间试图弄清楚这一点和我得到的是应用程序崩溃,不得不重新启动整个事情。这将意味着很多给我,如果任何人都可以帮助我在此
How通过导航抽屉导航到不同的活动
OnItemClickListener导航抽屉
http://blog.evizija.si/android-layout/
下面是codeS,我已经为我的MainActivity,NavigationDrawer和NavigationDrawerAdapter。
NavigationDrawerFragment:
公共类NavigationDrawerFragment扩展片段{
私人RecyclerView recyclerView;
公共静态最后弦乐preF_FILE_NAME =测试preF;
公共静态最后弦乐KEY_USER_LEARNED_DRAWER =user_learned_drawer;
私人ActionBarDrawerToggle mDrawerToggle;
私人DrawerLayout mDrawerLayout;
私人NavigationDrawerAdapter适配器;
/ *这是告诉用户,有一个抽屉式导航* /
私人布尔mUserLearnedDrawer;
私人布尔mFromSavedInstanceState;
私人查看containerView;
公共NavigationDrawerFragment(){
//要求空公共构造
}
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
mUserLearnedDrawer =通过Boolean.valueOf(readFrom preferences(getActivity(),KEY_USER_LEARNED_DRAWER,假));
如果(savedInstanceState!= NULL){
mFromSavedInstanceState = TRUE;
}
}
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
//充气的布局该片段
查看布局= inflater.inflate(R.layout.fragment_navigation_drawer,集装箱,假);
recyclerView =(RecyclerView)layout.findViewById(R.id.navigation_drawer_list);
适配器=新NavigationDrawerAdapter(getActivity(),的getData());
recyclerView.setAdapter(适配器);
recyclerView.setLayoutManager(新LinearLayoutManager(getActivity()));
返回布局;
}
//改变可绘制和文本这里的NavigationDrawer列表项
公共静态列表< NavigationDrawerItems>的getData(){
名单< NavigationDrawerItems>数据=新的ArrayList<>();
INT []图标= {R.drawable.ic_account_circle_black_36dp,R.drawable.ic_home_black_36dp,R.drawable.ic_language_black_36dp,R.drawable.ic_redeem_black_36dp,R.drawable.ic_settings_black_36dp};
的String []标题= {餐厅,类别,规划,关于我们,设置};
的for(int i = 0; I< titles.length和放大器;&安培; I< icons.length;我++){
NavigationDrawerItems电流=新NavigationDrawerItems();
current.iconId =图标[I]
current.title =标题[I]
data.add(电流);
}
返回的数据;
}
公共无效设置(诠释fragmentId,DrawerLayout drawerLayout,工具栏工具栏){
containerView = getActivity()findViewById(fragmentId)。
mDrawerLayout = drawerLayout;
mDrawerToggle =新ActionBarDrawerToggle(getActivity(),drawerLayout,工具栏,R.string.drawer_open,R.string.drawer_close){
@覆盖
公共无效onDrawerOpened(查看drawerView){
super.onDrawerOpened(drawerView);
如果(!mUserLearnedDrawer){
mUserLearnedDrawer = TRUE;
saveTo preferences(getActivity(),KEY_USER_LEARNED_DRAWER,mUserLearnedDrawer +);
}
。getActivity()invalidateOptionsMenu();
}
@覆盖
公共无效onDrawerClosed(查看drawerView){
super.onDrawerClosed(drawerView);
。getActivity()invalidateOptionsMenu();
}
};
如果(mUserLearnedDrawer&安培;!&安培;!mFromSavedInstanceState){
mDrawerLayout.openDrawer(containerView);
}
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(新的Runnable(){
@覆盖
公共无效的run(){
mDrawerToggle.syncState();
}
});
}
公共静态无效saveTo preferences(上下文的背景下,字符串preferenceName,字符串preferenceValue){
共享preferences共享preferences = context.getShared preferences(preF_FILE_NAME,Context.MODE_PRIVATE);
共享preferences.Editor编辑=共享preferences.edit();
editor.putString(preferenceName,preferenceValue);
editor.apply();
}
公共静态字符串readFrom preferences(上下文的背景下,字符串preferenceName,字符串设置defaultValue){
共享preferences共享preferences = context.getShared preferences(preF_FILE_NAME,Context.MODE_PRIVATE);
返回共享preferences.getString(preferenceName,设置defaultValue);
}
}
MainActivity:
公共类MainActivity扩展ActionBarActivity {
私人工具条工具栏;
私人NavigationDrawerFragment drawerFragment;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main_appbar);
/ * =======低于该三语句添加自定义工具栏,包括私人上述声明和抽屉式导航======= * /
工具栏=(栏)findViewById(R.id.app_bar);
setSupportActionBar(工具栏);
getSupportActionBar()setDisplayHomeAsUpEnabled(真)。
drawerFragment =(NavigationDrawerFragment)
。getSupportFragmentManager()findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer,(DrawerLayout)findViewById(R.id.drawer_layout),工具栏);
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.menu_main,菜单);
返回true;
}
@覆盖
公共布尔onOptionsItemSelected(菜单项项){
//处理动作栏项目点击这里。将操作栏
//自动在主/向上按钮操作的点击,只要
//你在AndroidManifest.xml中指定一个父活动。
INT的id = item.getItemId();
/ * =======术语导航取自menu_main.xml文件。重命名在需要的时候======= * /
/ * =======的startActivity语句使被点击的图标,并带来了另一个活动======= * /
如果(ID == R.id.navigate){
startActivity(新意图(这一点,SubActivity.class));
}
返回super.onOptionsItemSelected(项目);
}
}
NavigationDrawerAdapter:
公共类NavigationDrawerAdapter扩展RecyclerView.Adapter< NavigationDrawerAdapter.MyViewHolder> {
私人LayoutInflater充气;
名单< NavigationDrawerItems>数据= Collections.emptyList();
公共NavigationDrawerAdapter(上下文的背景下,名单,其中,NavigationDrawerItems>数据){
充气= LayoutInflater.from(上下文);
this.data =数据;
}
@覆盖
公共MyViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
查看查看= inflater.inflate(R.layout.fragment_navigation_drawer_row,父母,假);
MyViewHolder持有人=新MyViewHolder(视图);
回报持有人;
}
@覆盖
公共无效onBindViewHolder(MyViewHolder持有人,INT位置){
NavigationDrawerItems电流= data.get(位置);
holder.title.setText(current.title);
holder.icon.setImageResource(current.iconId);
}
@覆盖
公众诠释getItemCount(){
返回data.size();
}
类MyViewHolder扩展RecyclerView.ViewHolder {
TextView的称号;
ImageView的图标;
公共MyViewHolder(查看ItemView控件){
超(ItemView控件);
标题=(TextView中)itemView.findViewById(R.id.navigation_drawer_list_text);
图标=(ImageView的)itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
}
在你的适配器类试试这个:
类MyViewHolder扩展RecyclerView.ViewHolder {
TextView的称号;
ImageView的图标;
公共MyViewHolder(查看ItemView控件){
超(ItemView控件);
itemView.setOnClickListener(新View.OnCLickListener(){
@覆盖
公共无效的onClick(视图v){
意向意图=新的意图(背景下,YourActivity.class);
context.startActivity(意向)
}
});
itemView.findViewById(R.id.navigation_drawer_list_text);
图标=(ImageView的)itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
你必须有一个参照上下文
变量,你可以拥有它,你可以得到它通过分配在适配器类的构造函数。
希望这有助于!
I had created a Navigation Drawer with a RecyclerView inside of it. I had learned that from YouTube. However I had trouble implementing an "onNavigationDrawerItemSelected" method for it. What I want to do is for the user to be able to click on the items in the list and it will navigate them to an Activity instead of a Fragment.
I am new to android programming, hence I am bad in understanding the codes. I've looked everywhere on tutorials online such as the links below, but it wouldn't work. I've spent a lot of time trying to figure this out and all I get is the app crashing and had to restart the whole thing. It would mean alot to me if anyone can help me on this
How to navigate to different activities through the navigation drawer
OnItemClickListener Navigation Drawer
http://blog.evizija.si/android-layout/
Below are the codes that I have made for my MainActivity, NavigationDrawer and NavigationDrawerAdapter.
NavigationDrawerFragment:
public class NavigationDrawerFragment extends Fragment {
private RecyclerView recyclerView;
public static final String PREF_FILE_NAME = "testpref";
public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer";
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private NavigationDrawerAdapter adapter;
/*This is to tell the User that there is a navigation drawer*/
private boolean mUserLearnedDrawer;
private boolean mFromSavedInstanceState;
private View containerView;
public NavigationDrawerFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
if (savedInstanceState != null) {
mFromSavedInstanceState = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
recyclerView = (RecyclerView) layout.findViewById(R.id.navigation_drawer_list);
adapter = new NavigationDrawerAdapter(getActivity(), getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return layout;
}
//Change the Drawables and Text Here for the NavigationDrawer List Items
public static List<NavigationDrawerItems> getData() {
List<NavigationDrawerItems> data = new ArrayList<>();
int[] icons = {R.drawable.ic_account_circle_black_36dp, R.drawable.ic_home_black_36dp, R.drawable.ic_language_black_36dp, R.drawable.ic_redeem_black_36dp, R.drawable.ic_settings_black_36dp};
String[] titles = {"Restaurants", "Categories", "Planner", "About Us", "Settings"};
for (int i = 0; i < titles.length && i < icons.length; i++) {
NavigationDrawerItems current = new NavigationDrawerItems();
current.iconId = icons[i];
current.title = titles[i];
data.add(current);
}
return data;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
containerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!mUserLearnedDrawer) {
mUserLearnedDrawer = true;
saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + "");
}
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActivity().invalidateOptionsMenu();
}
};
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(containerView);
}
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
}
public static void saveToPreferences(Context context, String preferenceName, String preferenceValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(preferenceName, preferenceValue);
editor.apply();
}
public static String readFromPreferences(Context context, String preferenceName, String defaultValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
return sharedPreferences.getString(preferenceName, defaultValue);
}
}
MainActivity:
public class MainActivity extends ActionBarActivity {
private Toolbar toolbar;
private NavigationDrawerFragment drawerFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_appbar);
/*======= This three statement below is to add the customized ToolBar including the "private" statement above and the navigation drawer =======*/
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@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();
/*======= The term "navigate" is taken from the menu_main.xml file. Rename them when necessary =======*/
/*======= The startActivity statement enables the icon to be clicked and brings to another activity =======*/
if (id == R.id.navigate) {
startActivity(new Intent(this, SubActivity.class));
}
return super.onOptionsItemSelected(item);
}
}
NavigationDrawerAdapter:
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {
private LayoutInflater inflater;
List<NavigationDrawerItems> data = Collections.emptyList();
public NavigationDrawerAdapter(Context context, List<NavigationDrawerItems> data) {
inflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.fragment_navigation_drawer_row, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
NavigationDrawerItems current = data.get(position);
holder.title.setText(current.title);
holder.icon.setImageResource(current.iconId);
}
@Override
public int getItemCount() {
return data.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.navigation_drawer_list_text);
icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
}
Try this in your adapter class:
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnCLickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, YourActivity.class);
context.startActivity(intent)
}
});
itemView.findViewById(R.id.navigation_drawer_list_text);
icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
you have to have a reference to the context
variable, you can have it you can get it through assignment in the constructor of the adapter class.
Hope this helps!
这篇关于导航抽屉RecyclerView项目点击一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!