Reputation: 2238
I am trying to add a Fragment inside the Navigation Drawer but strangely the final output does not seems like a navigation drawer. In the image below The Drawer is static on the page with no Frame layout content and toolbar. My Doubt is whether can we add the RecyclerView inside Fragment and then display it or should I just use the RecyclerView?
Following are the files:
MainActivity.java:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupToolbar();
drawerLayout = (DrawerLayout) findViewById(R.id.drawerMainActivity);
setupDrawerToggle();
Fragment squadFragment = new SquadFragment();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.containerView,squadFragment,null);
fragmentTransaction.commit();
}
void setupToolbar(){
toolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
void setupDrawerToggle(){
drawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.app_name,R.string.app_n ame);
//This is necessary to change the icon of the Drawer Toggle upon state change.
drawerToggle.syncState();
}
}
ReyclerViewFragment.java :
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.recyclerfragment,container,false);
navTitles = getResources().getStringArray(R.array.navDrawerItems);
navIcons = getResources().obtainTypedArray(R.array.navDrawerIcons);
recyclerViewAdapter = new Adapter(navTitles,navIcons,getActivity().getApplicationContext());
recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
recyclerView.setAdapter(new Adapter(null,null,getActivity().getApplicationContext()));
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
recyclerView.setAdapter(recyclerViewAdapter);
return v;
}
activity_main.xml :
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawerMainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<include android:id="@+id/toolBar"
layout="@layout/app_bar"/>
<FrameLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/containerView">
</FrameLayout>
</LinearLayout>
<fragment
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:name="com.example.hp.recyclernavigation.RecyclerFragment"
android:id="@+id/fragment"
>
</fragment>
</android.support.v4.widget.DrawerLayout>
recyclerfragment.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/recyclerView"
android:background="#FFFFFF"
android:layout_gravity="start"
/>
</LinearLayout>
Adapter.java:
Adapter(String[] titles , TypedArray icons , Context context){
this.titles = titles;
this.icons = icons;
this.context = context;
// inflator=LayoutInflater.from(context);
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView navTitle;
ImageView navIcon;
Context context;
public ViewHolder(View drawerItem , int itemType , Context context){
super(drawerItem);
this.context = context;
// drawerItem.setOnClickListener(this);
if(itemType==1){
navTitle = (TextView) itemView.findViewById(R.id.tv_NavTitle);
navIcon = (ImageView) itemView.findViewById(R.id.iv_NavIcon);
}
}
}
@Override
public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(viewType==1){
View itemLayout = layoutInflater.inflate(R.layout.drawer_item_layout,null);
return new ViewHolder(itemLayout,viewType,context);
}
else if (viewType==0) {
View itemHeader = layoutInflater.inflate(R.layout.header_layout,null);
return new ViewHolder(itemHeader,viewType,context);
}
return null;
}
@Override
public void onBindViewHolder(Adapter.ViewHolder holder, int position) {
if(position!=0){
holder.navTitle.setText(titles[position - 1]);
holder.navIcon.setImageResource(icons.getResourceId(position-1,-1));
}
}
@Override
public int getItemCount() {
return titles.length+1;
}
@Override
public int getItemViewType(int position) {
if(position==0)return 0;
else return 1;
}
Can Someone Please help me!!
Upvotes: 1
Views: 584
Reputation: 393
It looks like you have failed to specify the layout_gravity as well as the width property for the DrawerLayout
Your Layout should look somewhat like this
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:clickable="true"
android:layout_height="match_parent"/>
<fragment
android:id="@+id/fragment_drawer"
android:name="wsl.com.dryv.fragment.MainNavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
app:layout="@layout/fragment_navigation_drawer"/>
</android.support.v4.widget.DrawerLayout>
Upvotes: 0
Reputation: 117
You can view Android Navigation Drawer Sample by Google: https://github.com/googlesamples/android-NavigationDrawer
Upvotes: 1