如何在 Android 中使用 ViewPager 创建图片库?

How to create Image gallery using ViewPager in Android?

我想在 ViewPager 视图下方使用 ViewPager 和缩略图创建图库,具体说明在 this source code 中。 但我的问题是,我的 class 是一个片段而不是 Activity 并且 class 扩展了 DialogFragment。我很困惑如何做到这一点。我无法解决此错误:

The method getSupportFragmentManager() is undefined for the type Fragment

我知道我不能在 Fragment 中使用 getSupportFragmentManager() 但我不能使用 getFragmentManager() either.How 来解决这个问题?有人请帮忙。

我的适配器class:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private List<Integer> images;

    public ViewPagerAdapter(FragmentManager fm, List<Integer> imagesList) {
        super(fm);
        this.images = imagesList;
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.getInstance(images.get(position));
    }

    @Override
    public int getCount() {
        return images.size();
    }
}

适配器实例化:

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), images);
viewPager.setAdapter(adapter);

my class is a Fragment instead of Activity and the class extends DialogFragment. I am confused how to do this. I can't resolve this error:

在这种情况下,您必须直接使用 getFragmentManager()。如果您的片段来自支持包,Android 将 return 支持片段管理器。在这种情况下,我认为您可能想使用 getChildFragmentManager()

您有不止一种选择。不确定哪个最适合您的情况。

1). (可能是您需要的)fragment.getChildFragmentManager() 将为您的片段 return 嵌套片段管理器。它通常用于 adding/replacing 片段到其他片段,因此分页也是类似的情况。

2) getActivity().getFragmentManager() / getActivity().getSupportFragmentManager() 将 return Activity 的片段管理器(同样用于 adding/replacing 片段直接在 activity 布局

我在这里所做的是我创建了一个扩展 DialogFragmentDummyFragment 并将所有代码从 MainActivity 移动到那个 Fragment,你可以检查文件, 其余文件与您提供的代码 link 相同

MainActivity

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_dummy);

    getSupportFragmentManager().beginTransaction().replace(R.id.container, DummyFragment.newInstance()).commit();

}

}

layout_dummy.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout      xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

</FrameLayout>

DummyFragment // 你的对话片段

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
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 android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;

/**
* Created by Satyen on 11/16/15.
*/
public class DummyFragment extends DialogFragment {

View view;

private ArrayList<Integer> images;
private BitmapFactory.Options options;
private ViewPager viewPager;
private View btnNext, btnPrev;
private FragmentStatePagerAdapter adapter;
private LinearLayout thumbnailsContainer;
private final static int[] resourceIDs = new int[]{R.mipmap.a, R.mipmap.b,
        R.mipmap.c, R.mipmap.d, R.mipmap.e, R.mipmap.f, R.mipmap.g};

public static DummyFragment newInstance() {
    DummyFragment dummyFragment = new DummyFragment();
    return dummyFragment;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.activity_main, container, false);

    images = new ArrayList<>();

    //find view by id
    viewPager = (ViewPager) view.findViewById(R.id.view_pager);
    thumbnailsContainer = (LinearLayout) view.findViewById(R.id.container);
    btnNext = view.findViewById(R.id.next);
    btnPrev = view.findViewById(R.id.prev);

    btnPrev.setOnClickListener(onClickListener(0));
    btnNext.setOnClickListener(onClickListener(1));

    setImagesData();

    // init viewpager adapter and attach
    adapter = new ViewPagerAdapter(getChildFragmentManager(), images);
    viewPager.setAdapter(adapter);

    inflateThumbnails();
    return view;
}

private View.OnClickListener onClickListener(final int i) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (i > 0) {
                //next page
                if (viewPager.getCurrentItem() < viewPager.getAdapter().getCount() - 1) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                }
            } else {
                //previous page
                if (viewPager.getCurrentItem() > 0) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
                }
            }
        }
    };
}

private void setImagesData() {
    for (int i = 0; i < resourceIDs.length; i++) {
        images.add(resourceIDs[i]);
    }
}

private void inflateThumbnails() {
    for (int i = 0; i < images.size(); i++) {
        View imageLayout = getActivity().getLayoutInflater().inflate(R.layout.item_image, null);
        ImageView imageView = (ImageView) imageLayout.findViewById(R.id.img_thumb);
        imageView.setOnClickListener(onChagePageClickListener(i));
        options = new BitmapFactory.Options();
        options.inSampleSize = 3;
        options.inDither = false;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), images.get(i), options );
        imageView.setImageBitmap(bitmap);
        //set to image view
        imageView.setImageBitmap(bitmap);
        //add imageview
        thumbnailsContainer.addView(imageLayout);
    }
}

private View.OnClickListener onChagePageClickListener(final int i) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(i);
        }
    };
}
}

有一个用于为 viewPager 创建指示器的库,它显示 viewPager 中每个图像的小预览,能够实时删除项目。

很高兴看看: ThumbIndicator: