0

我的应用程序正在我的安卓手机(摩托罗拉里程碑)上运行。

我有 2 个 XML 文件,Splash 和 MainActivity,只有一个 ListActivity 菜单文件,用于将来重定向。

流程为:App debug -> Splash ->(仅查看4秒)->重定向到Menu -> on select,(CRASH)重定向到MainActivity

在 Splash.xml 和 MainActivity.xml 我有背景图像,这就是问题发生的地方。我有 4 张图片用于测试:

1. fon.jpg -> 112KB -> 1000x600
2. rockguitar.jpg -> 92KB -> 1280 x 1024
3. intro_low.jpg -> 80KB -> 850 x 1100
4. start_low.jpg -> 56KB -> 850 x 1100

我尝试了这些文件的各种组合,以检查我的代码是否错误,但一切正常并且图像显示,除了我一起使用 3. 和 4. 时,无论在哪个 XML 中它都会抛出错误:

16830000-byte external allocation too large for this process. VM won't let us allocate 16830000 bytes.

但它适用于任何其他组合(1. 和 4.、3. 和 2. 等)我在 Photoshop 中制作的最后两张图像,如果有帮助的话。我通过它是尺寸问题,所以我把它们变小了,但仍然没有运气。

有任何想法吗?

编辑:它每次都在同一地点崩溃,其中 (CRASH) 在小图中。

编辑第二部分:

我想将背景添加到整个窗口,所以当我到达它时,它有这 4 个列表选项和底部的一个背景。这就是我拥有的所有代码。或者我如何连接 XML 文件并将所有样式放入其中?因为我使用 setContent(R.layout.my_layout),所以会引发错误。

public class Menu extends ListActivity {

    String classes[] = { "MainActivity", "ex1", "ex2", "ex3" };

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        String strClass = classes[position];
        Class ourClass;
        try {
            ourClass = Class.forName("rock.school.rzn.rockquiz." + strClass);
            Intent outIntent = new Intent(Menu.this, ourClass);
            startActivity(outIntent);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(Menu.this,
                android.R.layout.simple_expandable_list_item_1, classes));
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.start_low, options); 

        BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
        ListView listView = getListView();
        listView.setBackgroundDrawable(drawable);
        listView.setPadding(0, 150, 0, 0);
    }

}
4

1 回答 1

1

正如崩溃日志所说,您的图像太大了。磁盘上的图像大小与内存中的图像大小不同,因为在磁盘上图像是压缩的。内存大小与图像的宽度和高度有关,请参阅这个类似的问题。

因此,如果我们假设 RGBA_8888,您的图像在内存中的大小应该类似于:

1. 1.90 MB
2. 4.76 MB
3. 2.86 MB
4. 2.86 MB

如果您的图像不需要 alpha 通道(即它们不透明),您可以使用 RGBA_555 加载它们:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_icon, options); 

BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
View yourview = findViewById(R.id.your_id);
yourview.setBackground(drawable);

您可以在 Activity 的onCreate方法中执行此操作。然后用于findViewById()获取视图(即 ImageView)并设置位图。

更新 2:

请试试这个。在您的 res/layout 文件夹中创建一个 my_layout.xml 文件并粘贴以下内容:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_background"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>

然后编辑您的活动的 onCreate 方法,如下所示

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


    setListAdapter(new ArrayAdapter<String>(Menu.this,
            android.R.layout.simple_expandable_list_item_1, classes));

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.start_low, options); 

    BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
    View background = findViewById(R.id.list_background);
    background.setBackgroundDrawable(drawable); 
}  
于 2013-06-23T12:04:27.190 回答