片段选项卡 viewpager 问题
Fragment tab viewpager issue
我有一个带有视图寻呼机和三个选项卡的片段
"FragmentOne" "FragmentTwo" 等等
在每个片段(页面)中,当我在 FragmentOne 选项卡中设置图像(位图)时,我想从图库或 camera.But 中设置图像位图也显示在其他片段中。但我希望独特的选定图像应该显示在相应片段的图像视图中。
我的 ViewPager class 看起来像。
public class MainFragment extends Fragment {
private ViewPager mViewPager;
private SlidingTabLayout mSlidingTabLayout;
// Tabs titles
private String[] tabsTitles = {"One", "Two", "Three"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.new_proj_frag_layout, container, false);
// ViewPager
mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(3);
mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager(), tabsTitles));
// Sliding tab layout
mSlidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
return rootView;
}
FragmentOne
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.white_fragment_layout, container, false);
image_one_btn = (ImageView) rootView.findViewById(R.id.image_one_click);
image_one_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectImage();
}
});
return rootView;
}
private void selectImage() {
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
getParentFragment().startActivityForResult(i, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
Log.i("ImagePath:","===="+picturePath);
image_one_btn.setImageBitmap(BitmapFactory.decodeFile(picturePath));
cursor.close();
} else {
Toast.makeText(getActivity(), "Try Again!!", Toast.LENGTH_SHORT).show();
}
}
ViewPagerAdapter
public class ViewPagerAdapter extends FragmentPagerAdapter {
private String[] tabsTitles;
public ViewPagerAdapter(FragmentManager fm, String[] tabsTitles) {
super(fm);
this.tabsTitles = tabsTitles;
}
@Override
public CharSequence getPageTitle(int position) {
return tabsTitles[position];
}
@Override
public Fragment getItem(int index) {
switch(index) {
case 0:
return new ImageOneFragment();
case 1:
return new ImageTwoFragment();
case 2:
return new ImageThreeFragment();
}
return null;
}
@Override
public int getCount() {
return tabsTitles.length;
}
}
将构造函数添加到您的片段中,如下所述。
public static ImageOneFragment newInstance() {
ImageOneFragment myFragment = new ImageOneFragment ();
Bundle args = new Bundle();
myFragment.setArguments(args);
return myFragment;}
然后在你查看寻呼机里面做下面的编辑。
switch(index) {
case 0:
return ImageOneFragment.newInstance();
case 1:
return ImageOneFragment.newInstance();
case 2:
return ImageOneFragment.newInstance();
}
return null;
这将创建片段的新实例,每个部分都作为新对象。
也编辑这个选图方法
private void selectImage() {
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 1);}
删除 getparentFragment() 因为它会给你父片段结果,然后父片段将它传递给 onActivityResult 的所有子片段。
进行以下编辑以使其正常工作
将此方法添加到您的 ImageOneFragment 并将 onActivityResult 的实现移动到该方法。
public void handleResult(int requestCode,int resultCode,Intent data){}
比在您的主要片段中添加这样的新列表。
private ArrayList<Fragment>pages;
pages=new ArrayList<Fragment>();
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());
将此列表传递给您的查看寻呼机并根据您的查看寻呼机进行更改。
比起从任何片段中选择图像时,它会将结果提供给主片段,并且主片段内部的 onActivityResult() 管理结果如下。
pages.get(viewpager.getselectedItem()).handleresult(requestCode,resultCode,data);
这样就可以了。
以下是可能对遇到相同问题的任何人有所帮助的解决方案。
MainFragment add the following code
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
fragment.onActivityResult(requestCode, resultCode, data);
Log.i("in activity result","");
}
}
}
并在 ImageOneFragment
的 onActivityResult 方法中检查 requestCode
,例如
if (requestCode == 1){
// 将图像设置为 imageview
}
我有一个带有视图寻呼机和三个选项卡的片段 "FragmentOne" "FragmentTwo" 等等
在每个片段(页面)中,当我在 FragmentOne 选项卡中设置图像(位图)时,我想从图库或 camera.But 中设置图像位图也显示在其他片段中。但我希望独特的选定图像应该显示在相应片段的图像视图中。
我的 ViewPager class 看起来像。
public class MainFragment extends Fragment {
private ViewPager mViewPager;
private SlidingTabLayout mSlidingTabLayout;
// Tabs titles
private String[] tabsTitles = {"One", "Two", "Three"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.new_proj_frag_layout, container, false);
// ViewPager
mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(3);
mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager(), tabsTitles));
// Sliding tab layout
mSlidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
return rootView;
}
FragmentOne
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.white_fragment_layout, container, false);
image_one_btn = (ImageView) rootView.findViewById(R.id.image_one_click);
image_one_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectImage();
}
});
return rootView;
}
private void selectImage() {
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
getParentFragment().startActivityForResult(i, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
Log.i("ImagePath:","===="+picturePath);
image_one_btn.setImageBitmap(BitmapFactory.decodeFile(picturePath));
cursor.close();
} else {
Toast.makeText(getActivity(), "Try Again!!", Toast.LENGTH_SHORT).show();
}
}
ViewPagerAdapter
public class ViewPagerAdapter extends FragmentPagerAdapter {
private String[] tabsTitles;
public ViewPagerAdapter(FragmentManager fm, String[] tabsTitles) {
super(fm);
this.tabsTitles = tabsTitles;
}
@Override
public CharSequence getPageTitle(int position) {
return tabsTitles[position];
}
@Override
public Fragment getItem(int index) {
switch(index) {
case 0:
return new ImageOneFragment();
case 1:
return new ImageTwoFragment();
case 2:
return new ImageThreeFragment();
}
return null;
}
@Override
public int getCount() {
return tabsTitles.length;
}
}
将构造函数添加到您的片段中,如下所述。
public static ImageOneFragment newInstance() {
ImageOneFragment myFragment = new ImageOneFragment ();
Bundle args = new Bundle();
myFragment.setArguments(args);
return myFragment;}
然后在你查看寻呼机里面做下面的编辑。
switch(index) {
case 0:
return ImageOneFragment.newInstance();
case 1:
return ImageOneFragment.newInstance();
case 2:
return ImageOneFragment.newInstance();
}
return null;
这将创建片段的新实例,每个部分都作为新对象。
也编辑这个选图方法
private void selectImage() {
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 1);}
删除 getparentFragment() 因为它会给你父片段结果,然后父片段将它传递给 onActivityResult 的所有子片段。
进行以下编辑以使其正常工作
将此方法添加到您的 ImageOneFragment 并将 onActivityResult 的实现移动到该方法。
public void handleResult(int requestCode,int resultCode,Intent data){}
比在您的主要片段中添加这样的新列表。
private ArrayList<Fragment>pages;
pages=new ArrayList<Fragment>();
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());
将此列表传递给您的查看寻呼机并根据您的查看寻呼机进行更改。 比起从任何片段中选择图像时,它会将结果提供给主片段,并且主片段内部的 onActivityResult() 管理结果如下。
pages.get(viewpager.getselectedItem()).handleresult(requestCode,resultCode,data);
这样就可以了。
以下是可能对遇到相同问题的任何人有所帮助的解决方案。
MainFragment add the following code
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
fragment.onActivityResult(requestCode, resultCode, data);
Log.i("in activity result","");
}
}
}
并在 ImageOneFragment
的 onActivityResult 方法中检查 requestCode
,例如
if (requestCode == 1){
// 将图像设置为 imageview
}