WebView:加载图像并适合屏幕宽度

时间:2014-11-03 11:56:10

标签: android android-fragments webview

我已经阅读过有关此问题的几个主题,但我还有另一个奇怪的错误行为:

我创建了一个ViewPager,其初始页数为5.如果达到了页数-2,

pagerAdapter.notifyDataSetChanged();

被调用。 片段都有自己的id,从1开始计数。所以第一个片段得到第一个,第二个片段得到第二个,依此类推。 每个片段都会从网络服务器中加载图片,具体取决于他们的ID:

webView.loadUrl("http://myserver/" + id + ".jpg");

现在看来,有时图像大于设备的屏幕宽度。这就是我添加这些内容的原因:

webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

前5个元素看起来非常合适,但是当试图滑动到下一个片段时,您必须先向左侧扫描3px的webview,然后再次滑动,以获得下一个片段。 我不知道为什么会这样,但是在最初的5张图片之后,它可以正常工作。也许它与以下事实有关:在开始时我告诉pageradapter有5个片段要显示,滚动后会添加更多片段。以下片段不受此问题的影响。 这是第一个问题。

第二个问题是,当刷过完全正确显示的图像时,有时图像将不适合屏幕。我必须将屏幕转为横向并返回到肖像,然后才能正确安装图像。 怎么会发生这种情况,为什么屏幕重新绘制时会起作用,但第一次尝试时却没有?它似乎有时会发生。

这是我的两个问题,第一个是前5个片段的最小wron拟合,第二个是滑动时有时不适合的图像,但是当屏幕被重绘时适合

这是我的主要活动:

public class MyActivity extends ActionBarActivity {

public static int NUM_PAGES = 5;

private ViewPager viewPager;
private CustomPagerAdapter pagerAdapter;

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

    viewPager = (ViewPager)findViewById(R.id.activity_my_viewpager);

    pagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {

        }

        @Override
        public void onPageSelected(int i) {
            if(NUM_PAGES - i <= 2) {
                NUM_PAGES+=3;
            }
            pagerAdapter.notifyDataSetChanged();
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
}

private class CustomPagerAdapter extends FragmentStatePagerAdapter {
    public CustomPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return ScreenFragment.create(position);
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}
}

这里是片段类:

public class ScreenFragment extends Fragment {

public static final String ARG_PAGE = "ARG_PAGE";

private int pageNumber;

public static ScreenFragment create(int pageNumber) {
    ScreenFragment fragment = new ScreenFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, pageNumber);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    pageNumber = getArguments().getInt(ARG_PAGE)+1;
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.fragment_screen, container, false);
    WebView webView = (WebView)viewGroup.findViewById(R.id.fragment_screen_webview);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.loadUrl("http://someserver/" + Integer.toString(number) + ".jpg");
    return viewGroup;
}
}

提前致谢

2 个答案:

答案 0 :(得分:1)

您应该尝试充气ImageView布局而不是使用WebView。 为每个页面充气ImageView时,您可以使用AsyncTask下载每个页面的图像。

见这里:https://stackoverflow.com/a/2472175/3064486

你可以让一个只包含android:scaleType="fitXY""fitCenter"的ImageView的布局然后在你的适配器内的onCreateView中,你可以使用findViewById来扩充这个布局并找到它内部的ImageView 。然后你可以使用img.setImageBitmap就像这个答案所暗示的那样。

答案 1 :(得分:0)

也许这会对你有帮助,

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN
);