6

Ho un'attività principale, all'interno della quale è presente un frammento con una vista immagine. Quando si fa clic su questa vista immagine, viene avviata una nuova attività che contiene una vista elenco. Voglio restituire la posizione (indice) che l'utente fa clic su questa vista elenco, torna al frammento.Come inviare dati da un'attività al suo frammento principale?

frammento di codice

package com.example.kedee.testgradle; 


import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class ASKFragment extends Fragment implements View.OnClickListener{ 
    private Context context; 
    private View rootView; 
    private int pos; 

    public ASKFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     rootView= inflater.inflate(R.layout.fragment_ask, container, false); 
     context=inflater.getContext(); 
     setListeners(); 
     return rootView; 
    } 

    void setListeners(){ 
     ImageView catIcon=(ImageView)rootView.findViewById(R.id.cat_icon); 
     catIcon.setOnClickListener(this); 



    } 

    @Override 
    public void onClick(View v) { 
     int vID=v.getId(); 
     if(vID==R.id.cat_icon){ 
      Intent intent=new Intent(getActivity(),ASK.class); 
      getActivity().startActivity(intent); 
     } 

    } 
}  

codice di attività che viene sempre chiamato da questo frammento. (ASK attività)

package com.example.kedee.testgradle; 

import android.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

public class ASK extends AppCompatActivity { 
    private int index; 
    private String[] catNames= {"Acad","Emer","Tech","Exam","Station","Finance","Medical","Place","Sports" , 
      "Others" }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ask); 
     ListView listView=(ListView)findViewById(R.id.ask_cat_listView); 
     listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,catNames)); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> listView, View v, int pos, long id){ 
       index=pos; 
       //code to return back this index to the parent fragment? 
      } 
     }); 
    } 


} 
+0

Salvare questa posizione in sharePrafrences. – HassanUsman

+4

@HassanUsman NO! 'startActivityForResult' è il caso d'uso appropriato qui –

+0

si può fare usando startActivityper Result –

risposta

0

È possibile raggiungere questo chiamando/inizio nuova attività avendo ListView

sostituendo startActivity a startSubActivity

e l'ulteriore inviare tutti i dati di nuovo a chiamare l'attività di conseguenza . Quindi gestirlo con onActivityResult.

0

è necessario utilizzare onActivityResult come qui di seguito

Nel principale attività in cui si dispone di Frammenti dovete scrivere come questo

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode,resultCode,data); 
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.viewpager); 
    fragment.onActivityResult(requestCode, resultCode, data); 
} 

Poi, nel tuo frammento in cui si desidera provocare devi scrivere come sotto

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 


    if(resultCode == getActivity().RESULT_OK) { 

     switch(requestCode) { 

      case REQUEST_PICK_FILE: 

       if(data.hasExtra(FilePicker.EXTRA_FILE_PATH)) { 

        selectedFile = new File 
          (data.getStringExtra(FilePicker.EXTRA_FILE_PATH)); 
        tvFile.setText(selectedFile.getPath()); 

       } 
       break; 
     } 
    } 
} 

E devi inserire questo codice su cui fa clic si vuole aprire attività

 Intent intent = new Intent(getActivity(), FilePicker.class); 
    startActivityForResult(intent, REQUEST_PICK_FILE); 
4

uso startSubActivity

1. in ASKFragment

Intent intent=new Intent(getActivity(),ASK.class); 
getActivity().startActivityForResult(intent, 22 /* any other request code you want */); 

2. posizione Passo con intento.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> listView, View v, int pos, long id){ 
       index=pos; 
       Intent i = new Intent(); 
       i.putExtra("position", index); 
       setResult(RESULT_OK, i); 
       finish(); 
      } 
     }); 

3. L'attività dal punto in cui si sta aggiungendo o sostituendo frammento.

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 22 && resultCode == RESULT_OK) { 
      // get the position from intent 
      if(data.getExtras()!=null && data.hasExtra("position")){ 
       int position = data.getExtras().getInt("position"); 
       // pass this position to fragment. 
      } 
     } 
    } 

EDIT
Invia il valore da attività a frammentarsi.
1) creare funzione nel frammento

public void getPositionOfList(int position){ 
    // here is the position 
} 

2) da Activity chiamando il metodo frammento.

if (requestCode == 22 && resultCode == RESULT_OK) { 
       // get the position from intent 
       if(data.getExtras()!=null && data.hasExtra("position")){ 
        int position = data.getExtras().getInt("position"); 
        // pass this position to fragment. 
        ((ASKFragment)fragmentManager.findFragmentById(/*id of your container*/)).getPositionOfList(position); 
       } 
      } 
+0

Grazie, questo ha aiutato :) ma qui l'indice è noto al frammento di holding di attività. Come far sapere a ASKFragment il valore dell'indice ?? @Deepak –

+0

Sì, l'ho fatto allo stesso modo :) Grazie mille per avermi aiutato :) –

Problemi correlati