У меня есть функция поиска по базе данных, работающая в 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



}
}
0
kirktoon1882 3 Сен 2014 в 18:32

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();
0
kirktoon1882 4 Сен 2014 в 18:17

Попробуй использовать

FragmentTransaction fragmentTransaction =
                getChildFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.graph_layout, checkUpGraphFragment);
        fragmentTransaction.commit();
0
jitain sharma 3 Сен 2014 в 18:40
2
Добавьте описание того, почему это решение проблемы. Прямо сейчас ответ очень низкого качества.
 – 
Cheesebaron
3 Сен 2014 в 19:39
Я думаю, что это решение может сработать, за исключением того, что я получаю сообщение об ошибке BackStackRecord java.lang.NullPointerException at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:394)
 – 
kirktoon1882
3 Сен 2014 в 21:04