I am trying to accomplish a task and even if I have read other topics on the same, I am experiencing extreme difficulty.
Situation
I have a program built from a navigation template and I am trying to add search functionality. I have accomplish this task with an app using activities but I haven't been able to recreate this with fragments.
Problem
When I try to search I get the error.
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{.MySearchableActivity}: java.lang.ClassCastException: .MySearchableActivity cannot be cast to android.app.Activity
I believe this is getting done because I am calling an intent in a fragment, however I am unsure of how else I can accomplish that.
public class MySearchableActivity extends Fragment {
RequestQueue requestQueue;
List<NumberResults> storiesList = new ArrayList<>();
private RecyclerView recycle;
private static final String TAG = "junk";
private Toolbar toolbar;
private ListView myList;
// final Context context = this;
// @Override
//protected void onCreate(Bundle savedInstanceState)
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//super.onCreate(savedInstanceState);
// setContentView(R.layout.fragment_ministry_numbers);
// toolbar = (Toolbar) findViewById(R.id.app_bar);
// setSupportActionBar(toolbar);
Log.i(TAG, "in MySearchableActivity");
View layout = inflater.inflate(R.layout.fragment_ministry_numbers, container, false);
recycle = (RecyclerView) layout.findViewById(R.id.drawrList);
recycle.setLayoutManager(new LinearLayoutManager(getActivity()));
recycle.setHasFixedSize(true);
Intent intent = getActivity().getIntent();
handleIntent(intent);
return layout;
}
private void handleIntent(Intent intent) {
// get the query out of the intent
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String searchQuery = intent.getStringExtra(SearchManager.QUERY);
doSearchQuery(searchQuery);
}
}
/*
@Override
protected void onNewIntent(Intent intent) {
Log.i(TAG, "in onNewIntent");
getActivity().setIntent(intent);
handleIntent(intent);
}
*/
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.searchActionBarItem);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setActionView(item, searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
searchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
);
}
private void doSearchQuery(String query) {
final MinNumAdapters rvAdapter = new MinNumAdapters(storiesList);
recycle.setAdapter(rvAdapter);
requestQueue = Volley.newRequestQueue(getActivity());
String url = "http://werver.com/searchablewho.php?owner=" + query;
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
if (response.length() > 0) {
storiesList.clear();
for (int i = 0; i < response.length(); i++) {
JSONObject jsonObject = response.getJSONObject(i);
NumberResults stories = new NumberResults();
if (!jsonObject.isNull("number")) {
stories.name = jsonObject.getString("number");
}
if (!jsonObject.isNull("owner")) {
stories.age = jsonObject.getString("owner");
}
storiesList.add(i, stories);
}
rvAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// do something
}
});
requestQueue.add(jsonArrayRequest);
}
}
Stack Trace
11-17 17:15:00.308 18802-18802/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: technologies.mirage.prigovdirectory, PID: 18802
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{technologies.mirage.prigovdirectory/technologies.mirage.prigovdirectory.MinNumResults.MySearchableActivity}: java.lang.ClassCastException: technologies.mirage.prigovdirectory.MinNumResults.MySearchableActivity cannot be cast to android.app.Activity
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassCastException: technologies.mirage.prigovdirectory.MinNumResults.MySearchableActivity cannot be cast to android.app.Activity
at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Call to Search
@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);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchActionBarItem = menu.findItem(R.id.searchActionBarItem);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchActionBarItem);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
return true;
}
App Manifest
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".MinNumResults.MySearchableActivity"/>
</activity>
<activity
android:name=".MinNumResults.MySearchableActivity"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/search_config"/>
</activity>
</application>