2014-09-03 2 views
0

J'ai une fonction de recherche de base de données travaillant dans un Fragment. Maintenant, je veux que le fragment de recherche soit remplacé par les détails Fragment lorsque l'utilisateur clique sur un élément dans la liste des résultats de la recherche. Je crois comprendre qu'une Fragment Transaction ne peut pas être initiée dans un Fragment, donc ce que j'ai fait est sous-classé le Fragment dans la Main Activity Class, et tout fonctionne bien, jusqu'à ce que vous vouliez cliquer sur un élément dans les résultats de recherche . Mon API minimum est 10, donc j'utilise la bibliothèque de support, et quand j'essaye de configurer la transaction dans le setOnClickListener() en faisant ceci: FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); J'obtiens l'avertissement: Cannot make a static reference to the non-static method getSupportFragmentManager() from the type FragmentActivity. Alors Comment puis-je remplacer ma recherche Fragment avec les détails Fragment dans le setOnClickListener()? Voici ce que j'ai:dans Android remplacer ListView Fragment avec des détails Fragment sur l'article cliquez sur

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 



} 
} 

Répondre

0

I figured it out. @jitain sharma m'a mis sur le bon chemin, même si j'ai trouvé que getChildFragmentManager() n'était pas ma solution. Voici ma solution:

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

essayez d'utiliser

FragmentTransaction fragmentTransaction = 
       getChildFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.graph_layout, checkUpGraphFragment); 
     fragmentTransaction.commit(); 
+2

Ajoutez une description pour expliquer pourquoi c'est la solution au problème. En ce moment, la réponse est de très mauvaise qualité. – Cheesebaron

+0

Je pense que cette solution peut fonctionner, sauf que j'obtiens une erreur à propos de l'exception java.lang.NullPointerException de BackStackRecord sur android.support.v4.app.BackStackRecord.doAddOp (BackStackRecord.java:394) ' – kirktoon1882

Questions connexes