2012-08-22 12 views
44

Ho una serie di schede all'interno di un FragmentActivity che ciascuna contiene il proprio frammento. Quando ho provato ad avviare una nuova attività all'interno di quel frammento tramite onClickListener e utilizzando il metodo startActivity(myIntent), la forza dell'applicazione si chiude.Come si avvia un'attività all'interno di un frammento?

Dopo aver cercato per un po ', ho trovato un riferimento o due per un metodo chiamato startActivityFromFragment, ma dopo aver cercato in giro per un'ora o giù di lì non riesco a trovare spiegazioni o esempi di come usarlo o se questo è cosa dovrei usare

Credo che quello che sto chiedendo sia se ci sia qualche differenza tra l'avvio di una nuova attività da un'attività e l'avvio di una nuova attività da un frammento, e in tal caso, cosa devo implementare?

+1

postale il codice e l'uscita logcat per cui la forza app chiude – Squonk

+1

'FragmentActivity.startActivityFromFragment()' viene chiamato da 'Fragment.startActivityForResult()' per attuare il suo comportamento, e 'Activity.startActivityFromFragment()' viene chiamato quando un frammento in questa attività chiama il suo 'startActivity()'. Non abbiamo bisogno di chiamarli direttamente. – naXa

risposta

47

Si dovrebbe farlo con getActivity().startActivity(myIntent)

+0

L'ho appena provato su un sospetto: all'interno di onClickListener ho impostato un intento e poi chiamo getActivity(). StartActivity (myIntent) - devo aggiungere altro in particolare per terminare il frammento o l'attività? –

+7

@EkKoZ: non è necessario.Il metodo 'startActivity (Intent intent)' di 'Fragment' fa effettivamente la stessa cosa. – Squonk

+0

questo è sicuro, ma ho pensato che potrebbe essere un problema di scope con il contesto – EkKoZ

6

lo faccio come questo, per lanciare il SendFreeTextActivity da un (personalizzato) frammento menu che appare in molteplici attività:

Nella classe MenuFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_menu, container, false); 

    final Button sendFreeTextButton = (Button) view.findViewById(R.id.sendFreeTextButton); 
    sendFreeTextButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.d(TAG, "sendFreeTextButton clicked"); 
      Intent intent = new Intent(getActivity(), SendFreeTextActivity.class); 
      MenuFragment.this.startActivity(intent); 
     } 
    }); 
    ... 
41

ho fatto, sotto il codice sta lavorando per me ....

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.hello_world, container, false); 

     Button newPage = (Button)v.findViewById(R.id.click); 
     newPage.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), HomeActivity.class); 
       startActivity(intent); 
      } 
     }); 
     return v; 
    } 

e assicurati che l'attività di destinazione sia registrata nel file Manifest.xml,

ma nel mio caso tutte le schede non sono mostrate in HomeActivity, c'è una soluzione per questo?

+0

funziona per me ora .. ma non capisco come funziona :-(.. perché non posso usare metodo onClick direttamente? .. –

1

Utilizzare il contesto di base dell'attività in cui risiede il frammento per avviare un intent.

Intent j = new Intent(fBaseCtx, NewactivityName.class);   
startActivity(j); 

dove fBaseCtx è BaseContext della vostra attività in corso. Puoi ottenerlo come fBaseCtx = getBaseContext();

7

La differenza tra avviare un'attività da un frammento e un'attività è come ottenere il contesto, perché in entrambi i casi deve essere un'attività.

Da un'attività: Il contesto è l'attività corrente (this)

Intent intent = new Intent(this, NewActivity.class); 
startActivity(intent); 

Da un frammento: Il contesto è l'attività principale (getActivity()). Si noti che il frammento stesso può avviare l'attività tramite startActivity(), non è necessario eseguirlo dall'attività.

Intent intent = new Intent(getActivity(), NewActivity.class); 
startActivity(intent);