2014-09-16 2 views
0

У меня есть поддержка Action Bar с двумя Tabs, на одной вкладке отображаются последние видеоклипы, а другая вкладка - функция поиска, чтобы найти видеоклипы. Я новичок в Fragments, и то, что я не могу найти, это заменить Search и Recent Fragments с фрагментом воспроизведения видео на элементе списка в главном контейнере Fragment. Вот контейнер активность:Как заменить один фрагмент на другой в элементе списка?

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. Есть идеи?

+0

вы можете отправить LogCat пожалуйста –

+0

fragTrans = fragMan.beginTransaction(); где вы объявили FragmentTransaction и FragmentManager? – Mike

+0

Нажмите на заднюю часть стола? Зачем? Я думал, что видео должно заменить прежнее. И попробуйте добавить вместо замены и прокомментировать нажатие на backstack. – icbytes

ответ

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();