6

Mam główną działalność, w środku której znajduje się fragment z widokiem obrazu. Po kliknięciu tego widoku obrazu rozpoczyna się nowe działanie, które zawiera widok listy. Chcę przywrócić pozycję (indeks), którą użytkownik klika w tym widoku listy, z powrotem do fragmentu.Jak wysłać dane z działania do jego fragmentu macierzystego?

fragment kodu

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

    } 
}  

Kodeks aktywność, która jest uzyskiwanie wywołana z tego fragmentu. (ASK aktywność)

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

Zapisz tę pozycję w sharePrafrences. – HassanUsman

+4

@HassanUsman NIE! 'startActivityForResult' to odpowiedni przypadek użycia tutaj –

+0

możesz zrobić używając startActivityfor Wynik –

Odpowiedz

0

Można to osiągnąć poprzez wywołanie/rozpoczynając nową działalność mającą ListView

zastępując startActivity do startActivityForResult

i dodatkowo wysyłać dane z powrotem do wywoływania aktywności odpowiednio . Następnie użyj go onActivityResult.

0

trzeba użyć OnActivityResult jak poniżej

W głównej działalności, w której trzeba Fragments trzeba napisać jak to

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

potem w swojej Fragment, w którym chcesz prowadzić musisz napisać jak poniżej:

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

I trzeba umieścić ten kod na którym kliknij chcesz otworzyć aktywności

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

użycie startActivityForResult

1. w ASKFragment

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

2. pozycję Przełęczy z zamiarem.

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. Aktywność skąd jesteś dodanie lub zastąpienie fragmentu.

@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
wysłanie wartości od aktywności do fragmentu.
1) w funkcji tworzenia fragmentu

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

2) od aktywności wywołującej sposób fragment.

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

Dzięki, pomogło to :) ale tutaj indeks jest znany fragmentowi trzymania aktywności. Jak ustawić ASKFragment na temat wartości indeksu ?? @Deepak –

+0

Tak, zrobiłem to w ten sam sposób :) Wielkie dzięki za pomoc :) –