Android ViewPager上的setCurrentItem调用导致应用程序因outofmemory错误而崩溃
我正在尝试创建一个应用程序,它有一组低分辨率的图像,每个图像大约50-70KB。可以在图像库中滑动,或者根据某些按钮,转到库中的特定图像。我使用FragmentStatePagerAdapter FSPA使用了ViewPager,因为我知道这是浏览图像的最佳内存方式。我希望这种方法能够确保在任何给定的时间点上只有3个图像/片段处于活动状态,因此不应该存在内存问题。这种方法在大多数模拟器上都能很好地工作。然而,当我尝试使用NexusOne模拟器时,我发现了一个问题。滑动部分工作正常,但如果我使用viewPager.SetCurrentItem方法使用按钮转到特定页面,应用程序将崩溃,并出现outofmemory错误。我需要做什么才能让这个工作在点击一个按钮后进入一个特定的图像 我有一个主活动页面和两个片段页面。代码如下: 主要活动页面:Android ViewPager上的setCurrentItem调用导致应用程序因outofmemory错误而崩溃,android,image,android-fragments,Android,Image,Android Fragments,我正在尝试创建一个应用程序,它有一组低分辨率的图像,每个图像大约50-70KB。可以在图像库中滑动,或者根据某些按钮,转到库中的特定图像。我使用FragmentStatePagerAdapter FSPA使用了ViewPager,因为我知道这是浏览图像的最佳内存方式。我希望这种方法能够确保在任何给定的时间点上只有3个图像/片段处于活动状态,因此不应该存在内存问题。这种方法在大多数模拟器上都能很好地工作。然而,当我尝试使用NexusOne模拟器时,我发现了一个问题。滑动部分工作正常,但如果我使用v
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.tryslider.tryslider.MainActivity">
</RelativeLayout>
以及图像片段代码:
package com.example.tryslider.tryslider;
/**
* Created by rahul on 8/3/14.
*/
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
public class ImageFragment extends Fragment {
private int index;
private int[] mImages = new int[] {
R.drawable.first,
R.drawable.second,
R.drawable.third,
R.drawable.fourth,
R.drawable.fifth,
R.drawable.sixth,
R.drawable.seventh,
R.drawable.eighth,
R.drawable.ninth,
R.drawable.tenth
};
static ImageFragment init(int val) {
ImageFragment myFrag = new ImageFragment();
Bundle args = new Bundle();
args.putInt("val", val);
myFrag.setArguments(args);
return myFrag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
index = getArguments() != null ? getArguments().getInt("val") : 1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layoutView = inflater.inflate(R.layout.fragment_image, container,
false);
ImageView imageView = (ImageView) layoutView.findViewById(R.id.imageView);
imageView.setImageResource(mImages[index]);
return layoutView;
}
}
我试着考虑了很多关于某某或其他方面的建议,但目前我正在努力解决这个问题。非常感谢您的帮助
@Override
public void destroyItem(View collection, int position, Object o) {
super.destroyItem(collection, position, o);
View view = (View)o;
((ViewPager) collection).removeView(view);
view = null;
}
本节不需要。FragmentStatePager将处理销毁和重新创建视图的操作
package com.example.tryslider.tryslider;
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.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import java.text.SimpleDateFormat;
public class MainActivity extends ActionBarActivity {
static final int ITEMS = 10;
MyAdapter viewAdapter;
ViewPager viewPager;
private Button goButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
viewAdapter = new MyAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(viewAdapter);
goButton = (Button) findViewById(R.id.goButton);
goButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
viewPager.setCurrentItem(5, false);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return ITEMS;
}
@Override
public Fragment getItem(int position) {
return ImageFragment.init(position);
}
@Override
public void destroyItem(View collection, int position, Object o) {
super.destroyItem(collection, position, o);
View view = (View)o;
((ViewPager) collection).removeView(view);
view = null;
}
}
}
package com.example.tryslider.tryslider;
/**
* Created by rahul on 8/3/14.
*/
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
public class ImageFragment extends Fragment {
private int index;
private int[] mImages = new int[] {
R.drawable.first,
R.drawable.second,
R.drawable.third,
R.drawable.fourth,
R.drawable.fifth,
R.drawable.sixth,
R.drawable.seventh,
R.drawable.eighth,
R.drawable.ninth,
R.drawable.tenth
};
static ImageFragment init(int val) {
ImageFragment myFrag = new ImageFragment();
Bundle args = new Bundle();
args.putInt("val", val);
myFrag.setArguments(args);
return myFrag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
index = getArguments() != null ? getArguments().getInt("val") : 1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layoutView = inflater.inflate(R.layout.fragment_image, container,
false);
ImageView imageView = (ImageView) layoutView.findViewById(R.id.imageView);
imageView.setImageResource(mImages[index]);
return layoutView;
}
}
@Override
public void destroyItem(View collection, int position, Object o) {
super.destroyItem(collection, position, o);
View view = (View)o;
((ViewPager) collection).removeView(view);
view = null;
}