如何在列表项单击时将一个片段替换为另一个片段?

时间:2014-09-16 15:36:33

标签: android android-fragments

我有两个Action Bar的支持Tabs,一个标签显示最近的视频剪辑,另一个标签是搜索功能,用于查找视频剪辑。我是Fragments的新手,而我无法工作的是用主容器片段中的列表项单击视频播放片段替换搜索和最近片段。这是容器活动:

public class SearchInterface extends ActionBarActivity {
ActionBar bar_AB;
Tab tab1, tab2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    overridePendingTransition(R.anim.fadein, R.anim.fadeout);
    setContentView(R.layout.frag1_main6);
    setupTabs();

}// --- END onCreate
private void setupTabs() {
    bar_AB = getSupportActionBar();
    bar_AB.setDisplayHomeAsUpEnabled(true);
    bar_AB.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    tab1 = bar_AB
            .newTab()
            .setText("Recent")
            .setTag(RECENT_TAB_TAG)
            .setTabListener(
                    new SupportFragmentTabListener<SSIRecentFrag>(
                            R.id.frag6_main_FL, this, RECENT_TAB_TAG,
                            SSIRecentFrag.class));
    bar_AB.addTab(tab1);
    bar_AB.selectTab(tab1);

    tab2 = bar_AB
            .newTab()
            .setText("Search")
            .setTag(SEARCH_TAB_TAG)
            .setTabListener(
                    new SupportFragmentTabListener<SSISearchFrag>(
                            R.id.frag6_main_FL, this, SEARCH_TAB_TAG,
                            SSISearchFrag.class));
    bar_AB.addTab(tab2);

}

}

这是容器XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frag6_main_FL"
android:layout_width="match_parent"
android:layout_height="match_parent" />

然后最近和搜索片段活动看起来像这样(这是搜索活动):

public class SSISearchFrag extends Fragment {
View searchRootView;
EditText searchbox_ET;
LinearLayout list_LL;
Button search_BTN;
DBAdapter dbHelper;
ListView s_LV;

Cursor getPathCursor;
String cursorSDFStr = null;
String cursorCalDateStr = null;
String cursorURLStr = null;
String cursorTitleStr = null;
String cursorVerseStr = null;

FragmentManager fragMan;
FragmentTransaction fragTrans;
Fragment searchListFrag;
SSIVideoFrag video_FRG;
final String SEARCH_TAB_TAG = "searchTag";
Fragment recentListFrag;
Callback fragBackPressed;

// --- 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);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);


    // --- Button
    search_BTN.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            imm.hideSoftInputFromWindow(search_BTN.getWindowToken(), 0);
            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_VERSE,
                        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_verse_tv,
                        R.id.slp_keywords_tv };

                SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(
                        getActivity(), R.layout.slp_list_item, cursor, columns, to,
                        0);

                s_LV = (ListView) searchRootView
                        .findViewById(R.id.ssisearch_list_lv);
                s_LV.setEmptyView(searchRootView
                        .findViewById(R.id.ssiempty_list_tv));
                s_LV.setAdapter(dataAdapter);
            }                   
            dbHelper.close();
            //--- onClick

            // --- pass to ListVideo
            s_LV.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    getPathCursor = (Cursor) s_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"));
                    cursorVerseStr = getPathCursor.getString(getPathCursor
                            .getColumnIndexOrThrow("verse"));

                    //--- video fragment here
                    fragTrans = fragMan.beginTransaction();
                    searchListFrag = fragMan.findFragmentByTag(SEARCH_TAB_TAG);
                    if(searchListFrag != null)fragTrans.remove(searchListFrag);
                    video_FRG = new SSIVideoFrag();
                    fragTrans.replace(R.id.frag6_main_FL, video_FRG);
                    fragTrans.addToBackStack(SSIVideoFrag.TAG);
                    fragTrans.commit();


                }

            });//--- END onClick

        }
    });//--- END Button




    return searchRootView;
}// --- END Create the ROOT VIEW

}

最近和搜索功能有效,当我点击列表项时,我得到NullPointerException。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您可能有一个空指针,因为片段管理器为空。你首先需要获得这样的引用(因为你使用的是ActionBarActivity,我想你需要SupportFragmentManager):

fragMan = getSupportFragmentManager();

此外,如果您想要替换片段,则无需手动删除它,因此您只需要:

fragTrans = fragMan.beginTransaction();
video_FRG = new SSIVideoFrag();
fragTrans.replace(R.id.frag6_main_FL, video_FRG);
fragTrans.addToBackStack(SSIVideoFrag.TAG);
fragTrans.commit();

或者你可以缩短它:

video_FRG = new SSIVideoFrag();
fragTrans = fragMan.beginTransaction().replace(R.id.frag6_main_FL, video_FRG)
.addToBackStack(SSIVideoFrag.TAG).commit();