Why doesn't the toolbar back button work? - android

I added a Toolbar to my Activity with back arrow like this:
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
//add back arrow - but it doesn't go back, nothing happens when I click it
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
But when I click the back arrow, it doesn't go back to previous page

add this lines:
#Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
#Override
public void onBackPressed() {
super.onBackPressed();
finish(); // or your code
}

You need to override onCreateOptionsMenu() and onOptionsItemSelected() just like this:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.your_id, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Don't forget to replace R.menu.your_id with your id as name suggest.

With suggested answers you might want to add parentActivity in your Android manifest.xml
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="#string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- The meta-data element is needed for versions lower than 4.1 -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
Docs: Android developers

Related

How to go back to previous activity

I have a problem with the lifecycle of the activities on android. I am trying to return back from my second activity to my first one. It actually my code is doing that, not the way it supposed to do it. I have "back button" on the top left corner and when I hit it - it goes through onDestroy() and onCreate() methods of my MainActivity. But if I use the back button on my phone - everything is OK(it goes just trough onResume() method) Can someone explain me - where my code is wrong?
in MainActivity.java:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.settings_menu, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
in my SettingsActivity.java:
package com.example.garagedoor;
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsActivity extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
#Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
}
in AndroidManifest.xml:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SettingsActivity"
android:label="#string/title_activity_settings"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
You need to add
android:launchMode="singleTop"
to the manifest entry for MainActivity. See the following questions:
ActionBar up navigation recreates parent activity instead of onResume
How can I return to a parent activity correctly?
Your problem is probably about the task stack. I am not sure what actionbar button do but i think you should either use
#Override public void onBackPressed()
in SettingsActivity or start the SettingsActivity with Intent flags like here:
https://developer.android.com/guide/components/activities/tasks-and-back-stack
Hope this helps.

can't click and move activity with the menu

I make a menu and only have one item with an icon, I intend to make the menu when I click move to another activity.
but with the code like below I can't even move to another activity maybe also can't click it, because there is no animation effect click on the menu,
I use minimum fire level 17 and run this in the PIE room, maybe fire level 28
Main activity
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
#Override
public boolean onOptionsItemSelected(#NonNull MenuItem item) {
if (item.getItemId() == R.id.tambah) {
Intent intent = new Intent(this, InsertAndViewActivity.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
Menu.xml from res > menu > menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="#+id/tambah"
android:icon="#android:drawable/ic_menu_add"
android:orderInCategory="300"
app:showAsAction="ifRoom"
android:title="tambah" />
</menu>
in this section I have made activity 3 namely (MainActivity.java, SpalashScreen.java and InsertAndViewActivity.java) as well as the layout for that activity, and I changed AndroidManifest.xml to the following
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:roundIcon="#mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity android:name=".InsertAndViewActivity"></activity>
<activity
android:name=".SplashScreen"
android:theme="#style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity" ></activity>
</application>
I intend to make the menu when I click move to another activity.
I hope this will work for you
Write your menu method's like this,
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.tambah:
Intent intent = new Intent(MainActivity.this, InsertAndViewActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}

How to return to previous activity through action bar?

I have an activity with action bar and I want return to the previuos one, how can I do it using action bar?
Add getActionBar().setDisplayHomeAsUpEnabled(true);.
and override onOptionsItemSelected() like below :
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Also specify parent activity in manifest file :
For example:
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="#string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>

Android Search Activity in Single Activity

I am trying to make my app consist a SINGLE activity. This activity should be able to create a search and also receive a search. Unfortunately, I am getting a "double" search bar in my SearchView when I click on the search button in the action bar. I mean that there is a search bar (dark-- SearchView) that appears for a second in the action bar, and then a second one (white) appears OVER the action bar. Any help? What am I doing wrong?
Sorry, this search thing is all new and confusing to me.
MainActivity (the only activity):
public class MainActivity extends ActionBarActivity {
Menu mMenu;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getSupportActionBar().setDisplayShowTitleEnabled(false);
setContentView(R.layout.activity_main);
handleIntent(getIntent());
}
#Override
protected void onNewIntent(Intent intent) {
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//use the query to search your data somehow
}
}
#SuppressLint("NewApi")
#Override
public boolean onCreateOptionsMenu(Menu menu) {
mMenu = menu;
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
}
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchRequested();
return true;
default:
return false;
}
}
#SuppressLint("NewApi")
#Override
public boolean onSearchRequested() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
MenuItem mi = mMenu.findItem(R.id.search);
if(mi.isActionViewExpanded()){
mi.collapseActionView();
} else{
mi.expandActionView();
}
} else{
//onOptionsItemSelected(mMenu.findItem(R.id.search));
}
return super.onSearchRequested();
}
}
main.xml (the menu xml):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:com.brianco.andypedia="http://schemas.android.com/apk/res-auto" >
<item android:id="#+id/search"
android:title="#string/action_settings"
android:icon="#drawable/ic_launcher"
android:actionProviderClass="android.support.v7.widget.ShareActionProvider"
com.brianco.andypedia:showAsAction="always|collapseActionView"
com.brianco.andypedia:actionViewClass="android.support.v7.widget.SearchView" />
<item
android:id="#+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="#string/action_settings"/>
</menu>
searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="#string/app_name"
android:hint="#string/search_hint"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" />
in the manifest:
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/Theme.AppCompat.Light.DarkActionBar" >
<activity
android:name="com.brianco.andypedia.MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable" android:resource="#xml/searchable" />
</activity>
<meta-data android:name="android.app.default_searchable"
android:value=".MainActivity" />
From Setting Up the Search Interface in the Android Documentation:
In your searchable activity, handle the ACTION_SEARCH intent by
checking for it in your onCreate() method.
Note: If your searchable activity launches in single top mode
(android:launchMode="singleTop"), also handle the ACTION_SEARCH intent
in the onNewIntent() method. In single top mode, only one instance of
your activity is created and subsequent calls to start your activity
do not create a new activity on the stack. This launch mode is useful
so users can perform searches from the same activity without creating
a new activity instance every time.
Please try to add the following attribute to your <activity> in your manifest file:
android:launchMode="singleTop"
This will make the same activity to receive the search intent.
More info here: http://developer.android.com/guide/topics/manifest/activity-element.html
Also, you have <intent-filter> declared twice, you should merge it into one element.
Okay, the problem had to do with calling onSearchRequested() in onOptionsItemSelected(MenuItem item). That is redundant when I have a SearchView and should only be called on older platforms.
So, I created a separate menu item for devices under Honeycomb. It is removed at runtime for newer devices. The SearchView is removed at runtime for older devices.
See updated code below:
#SuppressLint("NewApi")
#Override
public boolean onCreateOptionsMenu(Menu menu) {
mMenu = menu;
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//remove old
menu.removeItem(R.id.search_old);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
} else{
//remove new
menu.removeItem(R.id.search);
}
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search_old:
onSearchRequested();
return true;
default:
return false;
}
}
#SuppressLint("NewApi")
#Override
public boolean onSearchRequested() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
MenuItem mi = mMenu.findItem(R.id.search);
if(mi.isActionViewExpanded()){
mi.collapseActionView();
} else{
mi.expandActionView();
}
} else{
//onOptionsItemSelected(mMenu.findItem(R.id.search));
}
return super.onSearchRequested();
}
THANKS,
This has worked for me.
Manifest:
<activity
android:name=".Buscar"
android:configChanges="orientation|screenSize"
android:label="#string/title_activity_buscar"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="#xml/searchable" />
</activity>
Activity:
#Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// getIntent() should always return the most recent
setIntent(intent);
query = intent.getStringExtra(SearchManager.QUERY);
mysearch(query);
}

Set search hint dynamically

Does anybody knows how to set android search dialog hint dynamically?
T have try to do something like:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="#string/search_label"
android:hint="#string/search_hint"
android:id="#+id/search_dialog_text">
</searchable>
Somewhere:
#Override
public boolean onSearchRequested() {
Bundle appSearchData = new Bundle();
appSearchData.putString("SomeSpecificParam", SomeClass.class.getName());
startSearch("", false, appSearchData, false);
EditText text = (EditText )findViewById(R.id.search_dialog_text);
text.setHint("Search something else");
return true;
}
but text is equal null.
So looking forward you suggestions. Thanks.
This feels pretty hacky but worked for me - not truly dynamic but worked for alternating between the two search hints I needed:
I created a second searchable.xml (as described in the Android search docs), called searchable2.xml, with my second search hint defined.
I created a dummy activity extended from my original activity and overriding nothing.
In the manifest the dummy activity was associated with the new searchable2.xml:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="#xml/searchable"/>
</activity>
<activity android:name=".DummyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="#xml/searchable2"/>
</activity>
In 'MainActivity' I overrode 'onSearchRequested()' to reference the appropriate searchable activity:
public boolean onSearchRequested()
{
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
if(searchManager!=null)
{
// start the search with the appropriate searchable activity
// so we get the correct search hint in the search dialog
if(/* your condition here */)
searchManager.startSearch(null, false,new ComponentName(this, MainActivity.class), null, false);
else
searchManager.startSearch(null, false,new ComponentName(this, DummyActivity.class), null, false);
return true;
}
return false;
}
Nasty. But desperate times call for desperate measures...
AFAIK, and from looking at the Android source the class is only used to look up the metadata, but if anybody knows differently then please let me know.
They've added a note at http://developer.android.com/guide/topics/search/search-dialog.html#SearchableConfiguration stating that
Note: The system uses this file to instantiate a SearchableInfo object, but you cannot create this object yourself at runtime—you must declare the searchable configuration in XML.
So it seems that the answer to your question is that you cannot set the search dialog hint dynamically.
I managed to do this with ABS using the OnActionExpandListener and a custom actionView, e.g.:
menu.add("Search")
.setActionView(R.layout.collapsible_edittext)
.setOnActionExpandListener(new MenuItem.OnActionExpandListener()
{
#Override
public boolean onMenuItemActionExpand(MenuItem item) {
((EditText) item.getActionView()).setHint("Your custom text here");
return true;
}
#Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
with collapsible_edittext.xml:
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#color/search_fg"
android:background="#drawable/textfield_default_holo_light"
android:hint="[will be replaced at runtime]"/>
If you are using the Toolbar and SearchView widgets, you can easily set the search query hint by calling:
SearchView.setQueryHint(CharSequence hint)
It looks like you're almost there.
The SearchDialog source does this to get the auto complete editable.
mSearchAutoComplete = (SearchAutoComplete) findViewById(com.android.internal.R.id.search_src_text);
(note that the SearchAutoComplete class is a subclass of AutoCompleteTextView)
There is a much simpler answer than any of the above. It loads the default searchable.xml for your activity, and then uses java reflection to update the private mHintId field inside the SearchableInfo instance:
#Override
public void onPrepareOptionsMenu(Menu menu) {
SearchManager searchManager = (SearchManager)getActivity().getSystemService(Context.SEARCH_SERVICE);
SearchableInfo si = searchManager.getSearchableInfo( getActivity().getComponentName() );
try {
Field mHintId = si.getClass().getDeclaredField("mHintId");
mHintId.setAccessible(true);
mHintId.setInt(si, R.string.your_custom_hint);
} catch (Exception e) {
}
MenuItem mi = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView)mi.getActionView();
searchView.setSearchableInfo( si );
}
Thanks Mister Murakami for the idea, i have implemented the same concept to perform toggle search and as per my view its not a hack but its beauty of OOPs. Below program having a toggle icon in the action bar to switch between search hint.
RestaurantListingActivity.java
public class RestaurantListingActivity extends BaseMainActivity implements
TabListener {
private boolean isRestaurantSearch = true;
private SearchManager searchManager;
private SearchView searchView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar aBar = getActionBar();
aBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
aBar.addTab(aBar.newTab().setText("Place Order").setTabListener(this));
aBar.addTab(aBar.newTab().setText("My Account").setTabListener(this));
aBar.addTab(aBar.newTab().setText("Favorite").setTabListener(this));
aBar.addTab(aBar.newTab().setText("Vendor Portal").setTabListener(this));
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.restaturant_listing_menu, menu);
searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.rlm_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(new ComponentName(this,
RestaurantListingActivity.class)));
return super.onCreateOptionsMenu(menu);
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.rlm_toggle:
isRestaurantSearch = !isRestaurantSearch;
if (isRestaurantSearch)
searchView.setSearchableInfo(searchManager
.getSearchableInfo(new ComponentName(this,
RestaurantListingActivity.class)));
else
searchView.setSearchableInfo(searchManager
.getSearchableInfo(new ComponentName(this,
RestaurantFoodSwitcherActivity.class)));
break;
case R.id.rlm_change_loc:
break;
case R.id.rlm_filter_search:
break;
}
return super.onOptionsItemSelected(item);
}
#Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
#Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
#Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
#Override
public void setScreenData(Object screenData, int event, long time) {
// TODO Auto-generated method stub
}
#Override
public Activity getMyActivityReference() {
// TODO Auto-generated method stub
return null;
}
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
restaurant_listing_menu
<item
android:id="#+id/rlm_toggle"
android:showAsAction="always"
android:title="Toggle Search"
android:icon="#drawable/ic_action_refresh"
>
</item>
<item
android:id="#+id/rlm_search"
android:showAsAction="always|collapseActionView"
android:title="Search"
android:icon="#drawable/ic_action_search"
android:actionViewClass="android.widget.SearchView"
>
</item>
<item
android:id="#+id/rlm_filter_search"
android:showAsAction="ifRoom"
android:title="Filter Search"
android:icon="#drawable/ic_action_settings"
>
</item>
<item
android:id="#+id/rlm_change_loc"
android:showAsAction="ifRoom"
android:title="Change Location"
android:icon="#drawable/ic_action_location_off"
>
</item>
searchablerestra.xml inside res>xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="#string/search_hint_restra"
android:label="#string/app_name">
</searchable>
RestaurantFoodSwitcherActivity.java
public class RestaurantFoodSwitcherActivity extends RestaurantListingActivity {
}
searchablefood.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="#string/search_hint_food"
android:label="#string/app_name">
</searchable>
manifest.xml
<activity android:name="com.example.app.ui.activity.RestaurantListingActivity" >
<!-- This intent-filter identifies this activity as "searchable" -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- This metadata entry provides further configuration details for searches -->
<!-- that are handled by this activity. -->
<meta-data
android:name="android.app.searchable"
android:resource="#xml/searchablerestra"
/>
</activity>
<activity android:name="com.example.app.ui.activity.RestaurantFoodSwitcherActivity">
<!-- This intent-filter identifies this activity as "searchable" -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- This metadata entry provides further configuration details for searches -->
<!-- that are handled by this activity. -->
<meta-data
android:name="android.app.searchable"
android:resource="#xml/searchablefood"
/>
</activity>

Categories

Resources