【问题标题】:Fragment tab viewpager issue片段标签查看器问题
【发布时间】:2015-02-11 21:15:37
【问题描述】:

我有一个带有视图寻呼机和三个标签的片段 “FragmentOne”“FragmentTwo”等

在每个片段(页面)中,我想设置来自画廊或相机的图像。但是当我在 FragmentOne 选项卡中设置图像(位图)时,位图也显示在其他片段中。但我希望独特的选定图像应显示在相应片段的 Imageview 中。

我的 ViewPager 类看起来像。

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

片段一

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

}

【问题讨论】:

  • 片段二代码在哪里?你能把它也放在这里吗?
  • FragmentTwo 代码也与 fragmentOne 代码类似。
  • 您能发布您的视图寻呼机适配器实现吗?

标签: android android-fragments android-viewpager


【解决方案1】:

这里的解决方案可以帮助任何面临同样问题的人。

MainFragment 添加如下代码

@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){

// 将图像设置为图像视图

}

【讨论】:

    【解决方案2】:

    将构造函数添加到您的片段之一,如下所述。

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

    这会成功的。

    【讨论】:

    • 如果我删除 getparentFragment() 则不会设置 imageView。
    • 它会设置检查它
    • 没有 onActivityResult 没有被调用。
    • 我知道你的问题是由于嵌套的子片段。
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多