6

Ich habe eine Hauptaktivität, in der sich ein Fragment mit einer Bildansicht befindet. Wenn auf diese Bildansicht geklickt wird, wird eine neue Aktivität gestartet, die eine Listenansicht enthält. Ich möchte die Position (Index) zurückgeben, die der Benutzer auf diese Listenansicht klickt, zurück zum Fragment.Wie senden Sie Daten von einer Aktivität an ihr übergeordnetes Fragment?

Fragment-Code

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

    } 
}  

Code of Aktivität, die von diesem Fragment genannt zu werden. (ASK Aktivität)

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

Diese Position in sharePrafrences speichern. – HassanUsman

+4

@HassanUsman NEIN! 'startActivityForResult' ist der geeignete Anwendungsfall hier –

+0

Sie können startActivityfor Ergebnis verwenden –

Antwort

0

Sie dies erreichen können durch den Aufruf/Start neue Aktivität Listenansicht

von startActivity ersetzt

startActivityForResult und weiter alle Daten entsprechend dem Aufruf Aktivität zurückschicken . Behandle es dann mit onActivityResult.

0

Sie haben wie zu verwenden onActivityResult unter

In Hauptaktivität in dem Sie Fragmente haben Sie dieses schreiben

@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); 
} 

Dann in Ihrem Fragment, in dem Sie führen wollen Sie müssen wie folgt schreiben

@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; 
     } 
    } 
} 

Und müssen Sie diesen Code setzen, auf dem klicken Sie Aktivität öffnen möchten

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

Verwendung startActivityForResult

1. in ASKFragment

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

2. Pass Position mit Absicht.

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. Die Aktivität von wo aus Sie hinzufügen, oder ein Fragment zu ersetzen.

@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
den Wert von Aktivität zu Fragmente senden.
1) in Funktion Fragment

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

2) aus Aktivität erzeugen, das Fragment Methode aufrufen.

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

Danke, das half :) aber hier ist der Index der Aktivitätshalte Fragment bekannt. Wie man ASKFragment über den Indexwert informiert? @ Deepak –

+0

Ja, ich habe es auf die gleiche Weise :) Vielen Dank für die Hilfe :) –