how to connect search on action bar and sqlite database? - java

I am new on developing an android app. I am already following the code in this website.I wonder how to connect search on action bar that can search data on sqlite database?
This is my MainActivity.java
public class MainActivity extends Activity implements SearchView.OnQueryTextListener {
// More code
}
#Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
#Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
return false;
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
}
This is my SearchResultsActivity.java
public class SearchResultsActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handleIntent(getIntent());
}
#Override
protected void onNewIntent(Intent intent) {
//super.onNewIntent(intent);
setIntent(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
ListView listView = (ListView) findViewById(R.id.listView1);
DatabaseHandler db = new DatabaseHandler(this);
listView.setAdapter(null);
db.searchContacts(query);
}
}
}

Related

SearchView query resets after returning from Dialog

I have an SearchView and a button in an ActionBar. The button shows a DialogFragment that contains some checkboxes to filter search results. But when I click OK to close the DialogFragment, the SearchView query resets, and I don't know why. This is my code:
BusquedaActivity.java:
public class BusquedaActivity extends AppCompatActivity implements FiltroTemasDialogFragment.FiltroTemasDialogListener {
RecyclerView rv;
LinearLayoutManager lm;
RecursoAdapter ra;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set actionbar
// Create RecyclerView
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.busqueda, menu);
MenuItem searchItem = menu.findItem(R.id.acc_buscar);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setIconifiedByDefault(false);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
#Override
public boolean onQueryTextSubmit(String cad) {
buscador(cad);
return true;
}
#Override
public boolean onQueryTextChange(String cad) { return true; }
});
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.acc_listar:
FiltroTemasDialogFragment dialogFragment = new FiltroTemasDialogFragment();
dialogFragment.show(getSupportFragmentManager(),"filtro_temas");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
#Override
public void onDialogPositiveClick(FiltroTemasDialogFragment dialog) {
// ...
buscador(((SearchView) findViewById(R.id.acc_buscar)).getQuery().toString());
}
public void buscador(String cad){
// Search
ra.notifyDataSetChanged();
}
}
Thanks in advance.
I think you can declare the SearchView at the class. Then, you can refer it to get the text.
RecyclerView rv;
LinearLayoutManager lm;
RecursoAdapter ra;
private SearchView searchView;
Then change your:
SearchView searchView = (SearchView) searchItem.getActionView();
To
searchView = (SearchView) searchItem.getActionView();
After that, at your onDialogPositiveClick(). You refer it.
#Override
public void onDialogPositiveClick(FiltroTemasDialogFragment dialog) {
// ...
buscador(searchView.getQuery());
}

How do I show menu again on onPrepareOptionsMenu( );

Please help,
I want the menu to be hidden when I enter the Activity at the begining.
And after progressbar is set to gone, the menu will not be hidden.
But when I ran my app, the menu was always hidden.
I don't know how to show the menu on screen again.
HomeActivity.java
public class HomeActivity extends AppCompatActivity {
private ActivityHomeBinding binding;
private ActionBar actionBar;
private Menu menu;
private ProgressBar progressBar;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityHomeBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
actionBar = getSupportActionBar();
progressBar = binding.progressBar;
progressBar.setVisibility(View.VISIBLE);
// it's not work
onPrepareOptionsMenu(menu);
...
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.function_menu, menu);
return true;
}
#Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.clear();
if (progressBar.getVisibility() == View.VISIBLE) {
onCreateOptionsMenu(menu);
return false;
} else {
onCreateOptionsMenu(menu);
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.function_menu, menu);
return true;
}
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case R.id.menu_home:
intent = new Intent(HomeActivity.this, HomeActivity.class);
homeActivityResultLauncher.launch(intent);
return true;
case R.id.menu_summary:
intent = new Intent(HomeActivity.this, SummaryActivity.class);
summaryActivityResultLauncher.launch(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

search in fragment from navdrawer

Hi I want to put a search bar into my navigation drawer which I want to filter the items from Fragment.
I have Fragement under the nav drawer in the ss.
here is a bit of code.
<item android:id="#+id/action_search"
android:title="Search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
/>
Menu in the MainActivity
if (id == R.id.action_search) {
final MenuItem searchItem = item.findItem(R.id.action_search);
final SearchView searchView = (SearchView)
MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
}
here is the some chunk of code I got for search
#Override
public boolean onQueryTextSubmit(String query) {
return false;
}
#Override
public boolean onQueryTextChange(String newText) {
newText = newText.toLowerCase();
List<Example> newlist = new ArrayList<>();
for(Example example: newlist){
String name = example.getTitle().getRendered().toLowerCase();
if (name.contains(newText)) newlist.add(example);
}
adapter.setFilter(newlist);
return true;
}
}
Now how will I code the nav drawer in mainActivity or in fragment to make it possible that I can search in the fragment from nav drawer. Thanks.
Make a SearchManager class which fetches your data everytime onQueryTextChange is called. Then make a custom listener in SearchManager and implement it in your fragment and refresh it everytime your listener is called.
I got something like this in my MainActivity
SearchManager searchManager = SearchManager.sharedInstance();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
#Override
public boolean onQueryTextSubmit(String query) {
searchManager.onSearchQueryChanged(query);
return false;
}
#Override
public boolean onQueryTextChange(String query) {
searchManager.onSearchQueryChanged(query);
return false;
}
});
SearchManager class, I use a singleton because I want only one instance I can access from both the activity and the fragment
public class SearchManager {
private static SearchManager searchManager;
private OnSearchResultsListener onSearchResultsListener;
private List<mObject> searchResultList = new ArrayList<>();
public SearchManager() {
}
public void setOnSearchResultsListener(OnSearchResultsListener onSearchResultsListener) {
this.onSearchResultsListener = onSearchResultsListener;
}
public static SearchManager sharedInstance() {
if (searchManager == null) {
searchManager = new SearchManager();
}
return searchManager;
}
public void onContactSearchQueryChanged(String query) {
//do your logic here
this.searchResultList = ...;
onContactsSearchResultsListener.OnSearchResults(searchResultList);
}
}
A simple custom listener
public interface OnSearchResultsListener {
void OnSearchResults(List<mObject> searchResultList);
}
and then in your fragment
public class MFragment extends Fragment implements OnSearchResultsListener {
...
//in your OnCreateView
SearchManager.sharedInstance().setOnSearchResultsListener(this);
...
#Override
public void OnContactsSearchResults(List<mObject> searchResultList) {
//refresh UI
}

How to i get the searchbar in android to retain the search text in the search results view?

Like in google play, i want the search text to appear in the search bar in action bar in search activity. Currently it just disappears. How do i retain the search-bar and search text while displaying results in another view
In main activity i have
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
In search activity i have
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.booklisting);
// Get the Intent that started this activity and extract the string
handleIntent(getIntent());
//Intent intent = getIntent();
//String message = intent.getStringExtra("EXTRA_MESSAGE");
//execute_search(message);
}
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
/**
* Handling intent data
*/
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
execute_search(query);
}
}

Why am I getting this error in Android Studio on SearchView and OnQueryTextListener?

I have been trying to build a searchable interface in this app for a while, and I've been using a lot of the Android developer guides to help, but I recently ran into this error to do with SearchView and OnQueryTextListener that I do not know how to resolve, but it is stopping my app from running.
Here is my MainActivity:
public class MainActivity extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.overflow, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
//this is where the program crashes
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
searchView.setSearchableInfo(info);
return true;
}
public boolean onQueryTextSubmit(String query) {
// User pressed the search button
return false;
}
public boolean onQueryTextChange(String newText) {
// User changed the text
return false;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.constants:
startActivity(new Intent(MainActivity.this, FundamentalPhysicalConstants.class));
return true;
case R.id.joes_rules:
//go to rules
return true;
case R.id.home:
//Go back to the home screen
return true;
case R.id.search:
//open search
return true;
default:
// If we got here, the user's action was not recognized.
// Invoke the superclass to handle it.
return super.onOptionsItemSelected(item);
}
}
}
Here is my SearchableActivity:
public class SearchableActivity extends ListActivity {
DatabaseTable db= new DatabaseTable(this);
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
// get the intent sent when user searches from search widget, verify the action and exxtract what is typed in
Intent intent = getIntent();
handleIntent(intent);
}
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
Cursor c = db.getWordMatches(query, null);
//still need to process Cursor and display results
}
}
public void onListItemClick(ListView l,
View v, int position, long id) {
// call detail activity for clicked entry
}
private void doSearch(String queryStr) {
// get a Cursor, prepare the ListAdapter
// and set it
}
}
Here is my 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">
</searchable>
Here is my logcat:
06-08 14:57:09.581 28388-28388/com.gmd.referenceapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gmd.referenceapplication, PID: 28388
java.lang.ClassCastException: android.support.v7.widget.SearchView cannot be cast to android.support.v7.widget.SearchView$OnQueryTextListener
at com.gmd.referenceapplication.MainActivity.onCreateOptionsMenu(MainActivity.java:55)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:340)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:258)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
I have tried to do a lot of research on this, and I haven't had any luck. I would be extremely grateful for any help on this matter, thanks.
This line is just wrong:
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
You cannot cast the searchView into OnQueryTextListener. Instead give it a proper parameter as an anonymous class like this:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
#Override
public boolean onQueryTextSubmit(String query) {
//your logic
}
#Override
public boolean onQueryTextChange(String newText) {
//your logic
}
});
I now see that you have tried to add these two methods in your Activity, which is not the proper way to do it. You either need to create your custom class that implements this SearchView.OnQueryTextListener interface, and then say:
searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface);
Or do it the way above that I gave you as the first solution. That is the more common way of doing this, using anonymous classes.
the error is clear from the logs you are casting the SearchView to a listener which is wrong try something like
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
#Override
public boolean onQueryTextSubmit(String query) {
return false;
}
#Override
public boolean onQueryTextChange(String newText) {
return false;
}
});`

Categories

Resources