I'm getting following error:
cannot find symbol variable fragment
How to fix this error?
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.toi) {
fragment= new FragmentOne();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
return true;
} else if ( id ==R.id.thehindu){
}else if (id == R.id.support) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Change:
fragment= new FragmentOne();
To:
Fragment fragment= new FragmentOne();
Related
How do I remove the color of the selected section of the image within this function, thank you very much for the help, first code is the onnavigationitemselected, and the second the function which i want to remove the color of the selected
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_mapa)
{
// Handle the home action
MapFragment mapFragment = new MapFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mapFragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_anuncios)
{
AnunciosFragment anunciosFragment = new AnunciosFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, anunciosFragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_adopciones)
{
AdopcionesFragment adopcionesFragment = new AdopcionesFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, adopcionesFragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_protectoras)
{
ProtectorasFragment protectorasFragment = new ProtectorasFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, protectorasFragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_ajustes)
{
Toast.makeText(this, "Ajustes clicked", Toast.LENGTH_SHORT).show();
} else if (id == R.id.nav_contacto)
{
Toast.makeText(this, "Contacto Clicked", Toast.LENGTH_SHORT).show();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Perfil function:
public void Perfil(View view)
{
HomeFragment homeFragment = new HomeFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, homeFragment);
fragmentTransaction.commit();
//per tancar NAV al seleccionar
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
Image which i want to eliminate the selection :
you can do it like this:
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_camera:
break;
case R.id.nav_gallery:
break;
}
mDrawerLayout.closeDrawer(GravityCompat.START);
return false;
}
return false means unchecked state.
or else you can do it like :
drawer.getMenu().findItem(R.id.nav_camera).setChecked(false);
you need to se checked false unselect menu item
navigationView.getMenu().getItem(3).setChecked(false);
getItem(3) means you need to pass index of menu item
I am getting Problem in Navigation drawer if I am clicking any drawer item more than one time (Example 5 times) then on back press I am getting 5 time same fragment.
Suppose first I had click on Fragment one then 5 times on fragment two then after on Back Handling or on Back Pressed first 5 times second fragment has been called and the the fragment one.
I want that if the same no. of fragment I have clicked multiple times the no need to push it on stack.
How to handle this?
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener,HomeListFragment.MyListFragmentListener {
private Stack<Fragment> fragmentStack;
private FragmentManager fragmentManager;
private HomeListFragment homeListFragment;
private ResultListFragment resultListFragment;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});*/
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
fragmentStack = new Stack<Fragment>();
homeListFragment = new HomeListFragment();
homeListFragment.registerForListener(this);
fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.container, homeListFragment);
fragmentStack.push(homeListFragment);
ft.commit();
}
#Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (fragmentStack.size() >1) {
FragmentTransaction ft = fragmentManager.beginTransaction();
fragmentStack.lastElement().onPause();
ft.remove(fragmentStack.pop());
fragmentStack.lastElement().onResume();
ft.show(fragmentStack.lastElement());
ft.commit();
} else {
super.onBackPressed();
}
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.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();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
#Override
public void onItemClickedListener(String valueClicked) {
Toast.makeText(this, valueClicked, Toast.LENGTH_LONG).show();
FragmentTransaction ft = fragmentManager.beginTransaction();
resultListFragment = new ResultListFragment();
ft.add(R.id.container, resultListFragment);
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(resultListFragment);
ft.commit();
}
#SuppressWarnings("StatementWithEmptyBody")
#Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
FragmentTransaction ft = fragmentManager.beginTransaction();
One one = new One();
ft.replace(R.id.container, one,"One");
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(one);
ft.commit();
} else if (id == R.id.nav_gallery) {
FragmentTransaction ft = fragmentManager.beginTransaction();
Two two = new Two();
ft.replace(R.id.container, two,"Two");
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(two);
ft.commit();
} else if (id == R.id.nav_slideshow) {
FragmentTransaction ft = fragmentManager.beginTransaction();
Three three = new Three();
ft.replace(R.id.container, three,"Three");
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(three);
ft.commit();
} else if (id == R.id.nav_manage) {
FragmentTransaction ft = fragmentManager.beginTransaction();
Four four = new Four();
ft.replace(R.id.container, four,"Four");
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(four);
ft.commit();
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Please Help
//You are using backstack to hold the previous fragments remove all the fragment stacks
One one = new One();
ft.replace(R.id.container, one,"One");
ft.commit();
or you may use below code in backPress method
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
You can simply check the current fragment instance is exist or not by tag. Check the fragment is exist or not and then do your logic by that.
Fragment fragment = getFragmentManager().findFragmentByTag("yourstringtag");
if (fragment instanceof yourFragment) {
// No need to commit new one
} else {
// Commit new one
}
Another simple method to solve this issue by using a currentFragment instance. Please consider this as an example logic, I didn't checked it.
private Fragment mFragment;
#Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
if (!(mFragment instanceof One)) {
FragmentTransaction ft = fragmentManager.beginTransaction();
One one = new One();
ft.replace(R.id.container, one, "One");
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(one);
mFragment = one;
ft.commit();
}
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
I have successfully implemented navigation drawer but I'm having problems with it.
After selecting fragments and I click the back button, the current fragment pops off and the previous fragment is displayed.
But the title of the displayed fragment is still that of the previous fragment.
Also, the item checked in the drawer is still that of the previous fragment.
Please, do you have any idea how I might update the title and checked item?
My Activity
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private final String TAG = "MainActivity";
NavigationView navigationView;
#SuppressWarnings("StatementWithEmptyBody")
#Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
String about_blog = "http://example.com/page/json/urls/p-about";
String contri = "http://example.com/page/json/urls/contribute";
String privy = "http://example.com/page/json/urls/privacy-rules";
String contact = "http://example.com/page/json/urls/contact_us";
String advert = "http://example.com/page/json/urls/advertise-here";
String spons = "http://example.com/page/json/urls/sponsor-us";
Fragment fragment = null;
if (id == R.id.menu_home) {
fragment = new PostFragment();
}
if (id == R.id.about_blog) {
fragment = new PageFragment();
} else if (id == R.id.nav_contri) {
fragment = new PageFragment();
} else if (id == R.id.nav_contact) {
fragment = new PageFragment();
} else if (id == R.id.nav_privy) {
fragment = new PageFragment();
} else if (id == R.id.nav_advert) {
fragment = new PageFragment();
} else if (id == R.id.spons) {
fragment = new PageFragment();
} else if (id == R.id.app_about) {
//fragment = new abtFragment();
} else if (id == R.id.settings) {
//fragment = new SettingFragment;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "Device rotated and onCreate called");
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.setCheckedItem(R.id.menu_home);
navigationView.getMenu().performIdentifierAction(R.id.menu_home, 0);
}
UPDATE
I have fixed the issue of updating the title of each fragment after each backpress. What I did was to send the title as a string from MainActivity to the fragment, then in the fragment I receive it and call:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title);
This is how my onNavigationItemSelected Code looks like afterwards
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
id = item.getItemId();
Bundle bundle = new Bundle();
String about_blog = "http://example.com/page/json/urls/p-about";
String contri = "http://example.com/page/json/urls/contribute";
String privy = "http://example.com/page/json/urls/privacy-rules";
String contact = "http://example.com/page/json/urls/contact_us";
String advert = "http://example.com/page/json/urls/advertise-here";
String spons = "http://example.com/page/json/urls/sponsor-us";
Fragment fragment = null;
if (id == R.id.menu_home) {
fragment = new PostFragment();
bundle.putString("title", getString(R.string.home));
fragment.setArguments(bundle);
}
if (id == R.id.about_blog) {
bundle.putString("title", getString(R.string.about));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.nav_contri) {
bundle.putString("title", getString(R.string.contri));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.nav_contact) {
bundle.putString("title", getString(R.string.contac));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.nav_privy) {
bundle.putString("title", getString(R.string.privy_p));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.nav_advert) {
bundle.putString("title", getString(R.string.advert));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.spons) {
bundle.putString("title", getString(R.string.spons));
fragment = new PageFragment();
fragment.setArguments(bundle);
} else if (id == R.id.app_about) {
//fragment = new abtFragment();
} else if (id == R.id.settings) {
//fragment = new SettingFragment;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment, "visible_fragment");
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
//setTitle(item.getTitle()); // No longer needed.
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
In onCreateView of the fragment I received the String thus:
String title = getArguments().getString("title");
And then still in onCreateView I did:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title);
And the title is getting updated now.
The only problem that's is remaining now is the Navigation drawer item that refused to get updated.
And also Android Studio is complaining that method invocation ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title); mayproduce java.lang.NullPointerException.
You need to set Title for each Fragment Transaction.
Try by Changing on your onNavigationItemSelected like this.
Fragment fragment = null;
String title = "Test";
if (id == R.id.menu_home) {
fragment = new PostFragment();
title = "Post";
}
if (id == R.id.about_blog) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.nav_contri) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.nav_contact) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.nav_privy) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.nav_advert) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.spons) {
fragment = new PageFragment();
title = "Page";
} else if (id == R.id.app_about) {
//fragment = new abtFragment();
} else if (id == R.id.settings) {
//fragment = new SettingFragment;
}
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
**// set the toolbar title
getSupportActionBar().setTitle(title);**
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
EDIT 1:
OverRide onResume of your MainActivity.
Using this Code.
#Override
public void onResume() {
super.onResume();
// Set title
getActivity().getActionBar()
.setTitle("Your Title Goes Here");
}
You can also do like this.
#Override
public void onBackPressed() {
super.onBackPressed();
getSupportActionBar().setTitle(getResources().getString(R.string.titlefragment));
}
I'm a noob in app building but i'm trying!
I've build the base of an app, first try in android studio.
Build a menu with fragments in it.
However i would like to have one menu-item linked to an activity (because I would like it to look different than the rest.)
Tried a lot but it doesn't work.
could u help me?
this is my menu code:
#SuppressWarnings("StatementWithEmptyBody")
#Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_camera) {
MainFragment fragment = new MainFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_gallery) {
Zakkaartjes fragment = new Zakkaartjes();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_slideshow) {
Rekenen fragment = new Rekenen();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_manage) {
//THIS IS WHERE I WOULD LIKE TO HAVE A LINK TO MY "notities activity"
} else if (id == R.id.nav_share) {
Protocollen fragment = new Protocollen();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
} else if (id == R.id.nav_send) {
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","info#verpleegkundigzakboek.nl", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email van verpleegkundig zakboek app");
startActivity(Intent.createChooser(emailIntent, "Verzend e-mail"));
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Made Notities.java (with the other layout in it) and made activity_notities.xml
Hope anyone can help me?!
If I understand you correctly, this should work :
else if (id == R.id.nav_manage) {
Intent intent = new Intent(this, YourNextActivity.class);
startActivity(intent);
finish();
}
Also, you could consider use a switch instead of lots of else if :
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getId()){
case R.id.nav_camera:
//your code
break;
case R.id.nav_gallery:
//your code
break;
// add case blocks for each id you want to manage
}
}
More on switch here.
I created an Navigation Drawer Activity in Android Studio 1.4. My Main Activity is already setted up and now I want to switch to another Activity via the Navigation Drawer. The second Activity (AddDataActivity) should collect some User Unputs to create string which should be displayed in my Main Activities ListView.
My problem is, that I dont know how to open the AddDataActivity without "loosing" my navigation Drawer.
Intent AddData = new Intent(MainActivity.this, AddDataActivity.class);
MainActivity.this.startActivity(AddData);
Do I have to copy the whole Drawer Code for each Activity? Or would it be better to use Fragments?
I use Fragments now I avoid this Situation.
#SuppressWarnings("StatementWithEmptyBody")
#Override
public boolean onNavigationItemSelected(MenuItem item) {
Fragment fragment;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
fragment = new ListViewFragment();
int id = item.getItemId();
if (id == R.id.nav_listview) {
fragment= new ListViewFragment();
} else if (id == R.id.nav_add_data) {
fragment= new AddDataFragment();
} else if (id == R.id.nav_settings) {
fragment= new SettingsFragment();
} else if (id == R.id.nav_rooms) {
fragment= new SavedRoomsFragment();
} else if (id == R.id.nav_legal_information) {
fragment = new LegalInformationFragment();
}
ft.replace(R.id.container, fragment);
ft.addToBackStack(null);
ft.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}