调用位于另一个片段的视图寻呼机索引上的片段的 onActivityResult
Call onActivityResult of a fragment which is on view pager index of another fragment
我有一个 MainAcitivity,在它上面我有片段 A,其中包含带有两个片段 B 和 C 的视图寻呼机.....Frgamnet B 位于片段 A 中 viewpager
的 0 索引处并包含配置文件部分从图库或相机上传个人资料图片。选择图片时,将调用 main activity 的 onActivity 结果,然后我将其重定向到 viewpager
frgamentA 的实例,但我的问题是如何调用主显示的片段 B 的 onActivityResult
图片要设置在imageview中??
MainAcitivity -> frgamentA -> 片段 B
期待肯定的答复..
FRAGMENTB.java......
private void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);//
check="file";
startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (check.equalsIgnoreCase("file"))
onSelectFromGalleryResult(data);
else if (check.equalsIgnoreCase("camera"))
onCaptureImageResult(data);
}
}
主要ACTIVITY.java.
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.frame);
if (f instanceof FragmentA) { //fragement A is viewpager fragment
f.onActivityResult(requestCode, resultCode, intent);
}
}
FRAGMENTA.java.......
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
getTargetFragment().onActivityResult(requestCode, resultCode, intent);
}
HI 需要调用 FragmentB 的 onActivityResult
??
如果您想在片段中调用 startActivityForResult
,您将首先使用 getActivity()
。
private void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);//
check="file";
getActivity().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
}
您需要使用请求代码调用 startActivityForResult
我已经创建了一个示例,因为它运行良好,试试吧。
Activity 文件
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
public class ViewPagerActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewpager);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frameContainer, new FragmentA(), "ft");
transaction.addToBackStack(null);
transaction.commit();
}
}
片段A
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Objects;
public class FragmentA extends Fragment {
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_a, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewPager = view.findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(Objects.requireNonNull(getActivity()).getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
}
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private int NUM_ITEMS = 2;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0: // Fragment # 0 - This will show FirstFragment
return new FragmentB();
case 1: // Fragment # 0 - This will show FirstFragment different title
return new FragmentC();
default:
return null;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Frag B";
case 1:
return "Frag C";
}
return "Page " + position;
}
}
}
片段B
public class FragmentB extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_b, container, false);
}
}
这里是 FragmentC 你调用 startActivityForResult
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentC extends Fragment {
Button btnSelect;
int CAMERA_CODE = 1001;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_c, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
btnSelect = view.findViewById(R.id.btnSelect);
btnSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent cameraI = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraI, CAMERA_CODE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_CODE) {
Log.e("got it", "Frag C Got it.");
}
}
}
您必须从必须处理 activityResult 的组件调用 startActivityForResult()
。
例如:
如果你想处理Activity myAwesomeActivity
中的结果:
myAwesomeActivity.startActivityForResult();
如果你想在Fragment myAwesomeFragment
中处理结果
myAwesomeFragment.startActivityForResult();
为此,你最好打电话给
getParentFragment().startActivityForResult(),
然后在该父片段中,您可以实现
onActivityResult()
并在该方法中将结果传递给子片段,
childFragment.getParentFragment().onActivityResult(requestCode, resultCode, data)
我有一个 MainAcitivity,在它上面我有片段 A,其中包含带有两个片段 B 和 C 的视图寻呼机.....Frgamnet B 位于片段 A 中 viewpager
的 0 索引处并包含配置文件部分从图库或相机上传个人资料图片。选择图片时,将调用 main activity 的 onActivity 结果,然后我将其重定向到 viewpager
frgamentA 的实例,但我的问题是如何调用主显示的片段 B 的 onActivityResult
图片要设置在imageview中??
MainAcitivity -> frgamentA -> 片段 B
期待肯定的答复..
FRAGMENTB.java......
private void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);//
check="file";
startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (check.equalsIgnoreCase("file"))
onSelectFromGalleryResult(data);
else if (check.equalsIgnoreCase("camera"))
onCaptureImageResult(data);
}
}
主要ACTIVITY.java.
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.frame);
if (f instanceof FragmentA) { //fragement A is viewpager fragment
f.onActivityResult(requestCode, resultCode, intent);
}
}
FRAGMENTA.java.......
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
getTargetFragment().onActivityResult(requestCode, resultCode, intent);
}
HI 需要调用 FragmentB 的 onActivityResult
??
如果您想在片段中调用 startActivityForResult
,您将首先使用 getActivity()
。
private void galleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);//
check="file";
getActivity().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
}
您需要使用请求代码调用 startActivityForResult
我已经创建了一个示例,因为它运行良好,试试吧。
Activity 文件
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
public class ViewPagerActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewpager);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frameContainer, new FragmentA(), "ft");
transaction.addToBackStack(null);
transaction.commit();
}
}
片段A
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Objects;
public class FragmentA extends Fragment {
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_a, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewPager = view.findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(Objects.requireNonNull(getActivity()).getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
}
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private int NUM_ITEMS = 2;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0: // Fragment # 0 - This will show FirstFragment
return new FragmentB();
case 1: // Fragment # 0 - This will show FirstFragment different title
return new FragmentC();
default:
return null;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Frag B";
case 1:
return "Frag C";
}
return "Page " + position;
}
}
}
片段B
public class FragmentB extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_b, container, false);
}
}
这里是 FragmentC 你调用 startActivityForResult
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentC extends Fragment {
Button btnSelect;
int CAMERA_CODE = 1001;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_c, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
btnSelect = view.findViewById(R.id.btnSelect);
btnSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent cameraI = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraI, CAMERA_CODE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_CODE) {
Log.e("got it", "Frag C Got it.");
}
}
}
您必须从必须处理 activityResult 的组件调用 startActivityForResult()
。
例如:
如果你想处理Activity myAwesomeActivity
中的结果:
myAwesomeActivity.startActivityForResult();
如果你想在Fragment myAwesomeFragment
myAwesomeFragment.startActivityForResult();
为此,你最好打电话给
getParentFragment().startActivityForResult(),
然后在该父片段中,您可以实现
onActivityResult()
并在该方法中将结果传递给子片段,
childFragment.getParentFragment().onActivityResult(requestCode, resultCode, data)