【发布时间】:2014-10-03 15:45:10
【问题描述】:
我有一个Activity 动态添加两个片段。一个是隐藏的(无视图)Fragment,它具有setRetainInstance(true) 并处理我的数据库处理程序的接口。其目的是启动AsyncTask 以从数据库中获取数据并侦听数据库处理程序以返回其结果。然后它将通过另一个侦听器将数据交还给Activity。然后Activity 会将数据交给显示器Fragment,其中有一个ListView,并将相应地显示。
活动:不是片段活动
import android.app.Activity;
import android.os.Bundle;
public class Workout_Search_Display_Activity extends Activity {
private final String search_string = "SEARCH_STRING";
private final String search_type = "SEARCH_TYPE";
private String Search_String = "";
private String Search_Type = "";
private Workout_Search_Holder_Fragment SearchHolder;
private Workout_Search_Display_Fragment search_display_fragment;
private Workout_Search_Activity_Listener WSAL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Search_String = getIntent().getStringExtra(search_string);
Search_Type = getIntent().getStringExtra(search_type);
if (getFragmentManager().findFragmentById(android.R.id.content) == null) {
SearchHolder = Workout_Search_Holder_Fragment.newInstance(Search_String, Search_Type);
getFragmentManager().beginTransaction()
.add(android.R.id.content, SearchHolder).commit();
search_display_fragment = Workout_Search_Display_Fragment.newInstance();
getFragmentManager().beginTransaction()
.add(android.R.id.content, search_display_fragment).commit;
} //added too try to fix// else
//added to try to fix// SearchHolder = (Workout_Search_Holder_Fragment) getFragmentManager.findFragmentByTag("search_holder");
WSAL = new Workout_Search_Activity_Listener() {
public void NothingFound() {
search_display_fragment.no_data();
}
public void results_found(ArrayList<Search_Results_Holder> results) {
search_display_fragment.is_data();
search_display_fragment.handover_data(results);
}
};
SearchHolder.setListener(WSAL);
}
}
片段:
import android.app.Fragment;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
public class Workout_Search_Holder_Fragment extends Fragment implements DatabaseHelper.Workout_Search_Listener {
private String Search_String = "";
private String Search_Type = "";
private final static String search_string = "SEARCH_STRING";
private final static String search_type = "SEARCH_TYPE";
private Workout_Search_Activity_Listener listener;
protected static Workout_Search_Holder_Fragment newInstance(
String Search_String, String Search_Type) {
Workout_Search_Holder_Fragment f = new Workout_Search_Holder_Fragment();
Bundle args = new Bundle();
args.putString(search_string, Search_String);
args.putString(search_type, Search_Type);
f.setArguments(args);
return f;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
Search_String = getArguments().getString(search_string, null);
Search_Type = getArguments().getString(search_type, null);
sendSearch();
}
public Workout_Search_Activity_Listener getListener() {
return listener;
}
public void setListener(Workout_Search_Activity_Listener listener) {
this.listener = listener;
}
private void sendSearch() {
DatabaseHelper.getInstance(getActivity()).getSearchResultsAsync(
Search_String, Search_Type, this);
}
static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task, T... params) {
if (Build.VERSION.SDK_INT > +Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
task.execute(params);
}
}
@Override
public void return_no_results_found() {
listener.NothingFound();
}
@Override
public void return_search_results(ArrayList<Search_Results_Holder> results) {
Log.v("workout search holder fragment", "results found in fragment, handing off to activity");
listener.results_found(results);
}
}
我的问题是:旋转屏幕时,我的代码在 Activity 中的 Search_Hander 的 SetListener 上出现空指针异常而崩溃。如果我将Activity 更改为FragmentActivity 并使用SupportFragmentManager....这都不是问题...只需这些快速更改即可正常工作(关于现在已弃用的onRetainNonConfigurationInstance()被SupportFragmentManager 覆盖,它会为你处理一切)。
在尝试解决此问题时,我将其保留为Activity,但如果R.id.Content 不是null,则将SearchHolder = (Workout_Search_Holder_Fragment) getFragmentManager.findFragmentByTag("search_holder") 作为else 的一部分并给Fragment 一个标签当我最初设置它时,如果R.id.Content WAS null。请参阅上面注释掉的代码。这有效,但产生了另一个问题,onActivityCreated 再次启动并在我不想要的时候启动了我的 AsyncTask。我无法将savedInstanceState 包中的变量发送或检查到片段,因为setRetainInstance(true) 导致它为空。我知道我做错了什么,但无法绕过它。
【问题讨论】:
标签: android android-activity android-fragments fragmentmanager