【发布时间】:2016-11-18 07:14:22
【问题描述】:
我正在努力完成一项任务,即使我已经阅读了相同的其他主题,我也遇到了极大的困难。
情况
我有一个从导航模板构建的程序,我正在尝试添加搜索功能。我已经通过使用活动的应用程序完成了这项任务,但我无法使用片段重新创建它。
问题
当我尝试搜索时,我得到了错误。
java.lang.RuntimeException:无法实例化活动 组件信息{.MySearchableActivity}: java.lang.ClassCastException: .MySearchableActivity 无法转换为 android.app.Activity
我相信这已经完成,因为我在片段中调用了一个意图,但是我不确定我还能如何实现它。
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);
}
}
堆栈跟踪
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)
调用搜索
@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;
}
应用清单
<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>
【问题讨论】:
-
请发布所有课程和堆栈跟踪!
-
@BrunoDM 已更新。谢谢
-
如何调用 MySearchableActivity?看起来,你试着把它当作一个 Activity 来使用,但实际上它是一个 Fragment。你不应该这样命名片段。
-
@lewkka 我已将调用添加到 MySearchableActivity。它也出现在清单中,但据我所知(如果我错了,请纠正我)。它必须是一项活动。
-
是的,所以在你的情况下它不是一个活动,尽管你这样命名。
标签: java android android-fragments