У меня есть функция поиска по базе данных, работающая в Fragment
. Теперь я хочу, чтобы фрагмент поиска заменялся фрагментом деталей, когда пользователь щелкает элемент в списке результатов поиска. Насколько я понимаю, транзакция фрагмента не может быть инициирована во фрагменте, поэтому я сделал подкласс фрагмента в основном классе активности, и все работает нормально, пока вы не захотите щелкнуть элемент в результатах поиска. . Мой минимальный API - 10, поэтому я использую библиотеку поддержки, и когда я пытаюсь настроить транзакцию в setOnClickListener()
, выполнив следующие действия: FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
, я получаю предупреждение: Cannot make a static reference to the non-static method getSupportFragmentManager() from the type FragmentActivity
. Итак, как мне заменить фрагмент поиска на фрагмент сведений в setOnClickListener()
? Вот что у меня есть:
public class SearchInterface extends ActionBarActivity {
ActionBar bar_AB;
private static EditText searchbox_ET;
private static DBAdapter dbHelper;
static View searchRootView;
static ListView listView_LV;
String searchResultStr;
static Cursor getPathCursor;
static String cursorSDFStr = null;
static String cursorCalDateStr = null;
static String cursorURLStr = null;
static String cursorTitleStr = null;
static String cursorinfoBodyStr = null;
String videoURLStr = null;
String sdfStr = null;
String calDateStr = null;
String titleStr = null;
String infoBodyStr = null;
static FragmentManager fragMan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
// --- set up Action Bar
bar_AB = getSupportActionBar();
bar_AB.setDisplayHomeAsUpEnabled(true);
fragMan = getSupportFragmentManager();
if (fragMan.findFragmentById(android.R.id.content) == null) {
SSISearchFragEm searchEm_FRG = new SSISearchFragEm();
fragMan.beginTransaction().add(android.R.id.content, searchEm_FRG)
.commit();
}
}// --- END onCreate
public static class SSISearchFragEm extends Fragment {
LinearLayout list_LL;
private Button search_BTN;
// --- Create the ROOT VIEW
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
searchRootView = inflater.inflate(R.layout.ssi_search_frag,
container, false);
searchbox_ET = (EditText) searchRootView
.findViewById(R.id.ssi_Search1_et1);
search_BTN = (Button) searchRootView
.findViewById(R.id.ssi_search_btn1);
list_LL = (LinearLayout) searchRootView
.findViewById(R.id.ssi_search_list_LL);
// --- Button
search_BTN.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dbHelper = new DBAdapter(getActivity());
dbHelper.open();
String searchTermStr = searchbox_ET.getText().toString();
Cursor cursor = dbHelper.searchDB(searchTermStr);
if (cursor != null) {
String[] columns = new String[] { DBAdapter.KEY_TITLE,
DBAdapter.KEY_CAL_DATE, DBAdapter.KEY_PATH,
DBAdapter.KEY_SDF, DBAdapter.KEY_INFOBODY,
DBAdapter.KEY_KEYWORDS };
int[] to = new int[] { R.id.slp_title_tv, R.id.slp_date_tv,
R.id.slp_url_tv, R.id.slp_sdf_tv, R.id.slp_infoBody_tv,
R.id.slp_keywords_tv };
SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(
getActivity(), R.layout.slp_list_item, cursor, columns, to,
0);
listView_LV = (ListView) searchRootView
.findViewById(R.id.ssisearch_list_lv);
listView_LV.setEmptyView(searchRootView
.findViewById(R.id.ssiempty_list_tv));
listView_LV.setAdapter(dataAdapter);
}
dbHelper.close();
//--- onClick
// --- pass to ListVideo
listView_LV.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
getPathCursor = (Cursor) listView_LV
.getItemAtPosition(position);
cursorSDFStr = getPathCursor.getString(getPathCursor
.getColumnIndexOrThrow("sdfdate"));
cursorCalDateStr = getPathCursor.getString(getPathCursor
.getColumnIndexOrThrow("caldate"));
cursorURLStr = getPathCursor.getString(getPathCursor
.getColumnIndexOrThrow("path"));
cursorTitleStr = getPathCursor.getString(getPathCursor
.getColumnIndexOrThrow("title"));
cursorinfoBodyStr = getPathCursor.getString(getPathCursor
.getColumnIndexOrThrow("details"));
Toast.makeText(getActivity(), "Item Be Clicked!", Toast.LENGTH_SHORT).show();
//--- Detail fragment here?
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
}
});//--- END onClick
}
});
// --- END Button
return searchRootView;
}// --- END Create the ROOT VIEW
}
}
2 ответа
Я понял. @jitain sharma направил меня на правильный путь, хотя я обнаружил, что getChildFragmentManager()
не является моим решением. Вот мое решение:
fragTrans = fragMan.beginTransaction();
listFrag = fragMan.findFragmentByTag("com.myapp.SearchFragEm");
if(listFrag != null)fragTrans.remove(listFrag);
video_FRG = new SSIVideoFrag();
fragTrans.replace(R.id.frag5_main_FL, video_FRG);
fragTrans.addToBackStack(null);
fragTrans.commit();
Попробуй использовать
FragmentTransaction fragmentTransaction =
getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.graph_layout, checkUpGraphFragment);
fragmentTransaction.commit();
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.
java.lang.NullPointerException at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:394)