6

Come posso mostrare questo:getSupportFragmentManager non compila il DialogFragment

public class TagsDialog extends DialogFragment 
{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     builder.setView(inflater.inflate(R.layout.tags_dialog, null)); 
     builder.setMessage("This is a message").setTitle("TAGS"); 
     return builder.create(); 
    } 
} 

da dentro la mia Fragment all'interno di un ViewPager:

public class MyFragment extends Fragment 
    { 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 

    ... 

      ImageView btnTags = (ImageView)view.findViewById(R.id.btnTags); 
      btnTags.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 

        DialogFragment dlg = new TagsDialog(); 
        //this line doesn't compile 
        dlg.show(getSupportFragmentManager(), "tags"); 

       } 
      }); 
} 
} 

ho cercato per anni per arrivare a questo lavoro, ma getSupportFragmentManager non viene mai risolto ... qualche idea?

EDIT:

sento che questo è tutto causato dal FragmentManager supporto contro l'android.app.FragmentManager, però non so come risolvere questo, come lo sono io con il ViewPager dalla libreria di supporto ...

getSupportFragmentManager/e tutti i metodi getFragManager correlati come padre e figlio uno restituiscono sempre il Manager dalla lib di supporto, dove il metodo show vuole quello principale.

Le importazioni sono:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 

FragmentManager fm = getActivity().getSupportFragmentManager(); // returns from support lib 
DialogFragment dlg = new TagsDialog(); 
dlg.show(fm, "tags"); // wants core... 

Se mi basta usare nucleo, quindi getSupportFragmentManager() non esiste su getActivity() ...

+0

Cosa intendi per non risolto? Hai qualche traccia di stack? – Snicolas

+0

@Snicolas non viene compilato. Conoscete la linea rossa sqiggly. – sprocket12

+0

lol. Dove ? Quale linea, evidenziare // la linea colpevole – Snicolas

risposta

12

Si dovrebbe raddoppiare controllare le importazioni. Non è possibile utilizzare un mix di Frammento & FragmentManager dalla libreria di supporto e da Android API di base.

Se si utilizza il supporto, utilizzare tutto dal supporto (dal pacchetto android.support.v4.app). In caso contrario, utilizzare tutto dal pacchetto core api (android.app).

+0

Così utilizzare Frammenti & FragmentManager dalla libreria di supporto pure. – Snicolas

+0

Si prega di vedere le mie modifiche. – sprocket12

+1

Problema risolto. La discrepanza è stata risolta facendo in modo che anche il mio DialogFragment provenga dal supporto lib. – sprocket12

2

Ecco cosa faccio nel mio frammento che si trova in un ViewPager. Il codice per mostrare un DialogFragment è lo stesso ovunque tu voglia farlo.

FragmentManager fm = getActivity().getSupportFragmentManager(); 
ConfirmDeleteDialog dialog = new ConfirmDeleteDialog(); 
dialog.setTargetFragment(RecipeFragment.this, REQUEST_CONFIRM_RC); 
Bundle b = new Bundle(); 
b.putString(ConfirmDeleteDialog.EXTRA_CONFIRM_DIALOG_TYPE, 
     ConfirmDeleteDialog.CONFIRM_DIALOG_TYPE.COMMIT.name()); // enum determines what to display 
dialog.setArguments(b); 
dialog.show(fm, "confirm delete"); 

MODIFICA.

Penso che manchi il * getActivity(). * getSupportFragmentManager()

+0

non getFragmentManager tornare quello dall'attività. Vedi il javadoc. – Snicolas

+0

quindi è necessario fare in modo che sia il frammento e le classi sono DialogFragment dalla libreria di supporto v4. (e FragmentManager) –

+0

Dovresti invitare la mia risposta in modo tale;) – Snicolas