如何将数据从活动发送到其父代片段?
我有一个主要的活动,里面有一个图像视图的片段。点击此图像视图后,将启动一个包含列表视图的新活动。我想返回用户在这个列表视图上点击的位置(索引),回到片段。如何将数据从活动发送到其父代片段?
片段代码
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);
}
}
}
活动的代码,其正从该片段调用。 (ASK活动)
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?
}
});
}
}
你可以通过调用/开始有新的活动列表视图
实现这一目标通过更换startActivity到startActivityForResult
,并进一步发送任何数据传回相应的调用活动。然后,用onActivityResult处理它。
你必须使用OnActivityResult像下面
在主要活动中,你必须片段,你必须这样写
@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);
}
然后在您的片段要在其中产生你必须写下如下
@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;
}
}
}
而且你必须把这个代码在其上单击要打开活动
Intent intent = new Intent(getActivity(), FilePicker.class);
startActivityForResult(intent, REQUEST_PICK_FILE);
使用startActivityForResult
1 ASKFragment
Intent intent=new Intent(getActivity(),ASK.class);
getActivity().startActivityForResult(intent, 22 /* any other request code you want */);
2.通行证位置意图。
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.从正在添加或替换片段的活性。
@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
从活动发送的值以片段。
1)在从活动调用片段方法片段
public void getPositionOfList(int position){
// here is the position
}
2)创建功能。
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);
}
}
谢谢,这有助于:)但是这里索引是活动持有片段已知的。如何让ASKFragment知道索引值? @Deepak –
是的,我做了同样的方式:)非常感谢帮助我:) –
将此位置保存到sharePrafrences。 – HassanUsman
@HassanUsman不! 'startActivityForResult'在这里是合适的用例 –
你可以使用startActivityfor结果 –