需要帮助在活动加载和按钮按下时显示随机选择的图像。

4

我尝试创建一个只需在加载时加载随机图像的活动。它可以编译并正常加载,但是无法正常工作。有什么想法我做错了什么吗?这让我感到非常烦躁。

------------ 这是我的 RandomImage 类 --------------------------------------

package com.package.name; 

import java.util.Random; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View.OnClickListener; 

public class RandomImage extends Activity implements OnClickListener{ 
    private static final Random rgenerator = new Random(); 
    Integer [] mImageIds = { 
            R.drawable.pictureone, 
            R.drawable.picturetwo, 
            R.drawable.picturethree, 
            }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.randomimage); 
    Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)]; 
    ImageView iv = (ImageView) findViewById(R.id.imageviewyeah); 
    iv.setTag(q); 
    View nextButton = findViewById(R.id.next_image_button); 
    nextButton.setOnClickListener(this); 
} 

    @Override 
    public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.next_image_button: 
        Intent i = new Intent(this, RandomImage.class); 
        startActivity(i); 
        break; 
    } 
} 

    @Override 
        public boolean onCreateOptionsMenu (Menu menu) { 
                super.onCreateOptionsMenu(menu); 
                MenuInflater inflater = getMenuInflater(); 
                inflater.inflate(R.menu.menu3, menu); 
                return true; 
        } 
@Override 
public boolean onOptionsItemSelected (MenuItem item) { 
                switch (item.getItemId()) { 
                case R.id.menu: 
                        startActivity(new Intent(this, Main.class)); 
                        return true; 
} 

return false; 
        } 
}

------------这是我的布局------------------------------------------

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/widget0" 
android:background="@drawable/nhiebg" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
    android:layout_gravity="center" > 
<ImageView 
        android:id="@+id/imageviewyeah" 
        android:tag="q" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center"> 
</ImageView> 
<Button 
        android:id="@+id/next_image_button" 
        android:text="Next Image" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:padding="10dip" 
        android:typeface="serif"/> 
</LinearLayout>

非常感谢您的帮助,我按照您说的方法进行了尝试。然而,它只会在开始时加载一张随机图片,按钮根本没有作用。当我按下按钮时,原本显示的图片消失了,但是却没有新的图片加载进来。logcat中出现了很多信息,以下是前两行:

07-17 04:15:33.102: WARN/ResourceType(30476): 在获取资源编号0x00000002的值时没有包标识符 07-17 04:15:33.112: WARN/ImageView(30476): 找不到资源:2

--------------------------目前的情况--------------------------

public class RandomImage extends Activity implements OnClickListener{


    private Integer [] mImageIds = { 
            R.drawable.one, 
            R.drawable.two, 
            R.drawable.three, 
            };
    private static final Random rgenerator = new Random();

    private ImageView iv;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.randomimage);


    Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)];

    iv = (ImageView) findViewById(R.id.imageviewyeah);
    iv.setImageResource(q);


    View nextButton = findViewById(R.id.next_image_button);
    nextButton.setOnClickListener(this);

}


    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.next_image_button:
        iv.setImageResource(rgenerator.nextInt(mImageIds.length));
        break;
    }

}
我想指出的是,我尝试删除了这些行。
Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)];

和行

and iv.setImageResource(q);

而且它还是不起作用

1个回答

2

与其使用iv.setTag(q),建议尝试使用iv.setImageResource(q)


额外的改进:

您目前的方法可以显示一个新的随机图像,但它也会不必要地创建一个新的RandomImage活动,这可能会消耗内存和处理能力(每次按下按钮时)。

以下是一种更有效的方法:将iv声明为您活动的实例变量:

private ImageView iv;

在 onCreate() 方法中实例化它(只需删除 "ImageView"):

iv = (ImageView) findViewById(R.id.imageviewyeah);
这意味着您只需在活动期间设置一次。然后,在onClick()中替换即可。
Intent i = new Intent(this, RandomImage.class); 
startActivity(i); 
break; 

使用

iv.setImageResource(mImageIds[rgenerator.nextInt(mImageIds.length)]);

@brybam 是的!有一种更简单的方法。我会编辑上面的解决方案,因为评论有字符限制。祝你在Java中好运! :) - Andy Zhang
你的解决方案会消耗大量内存,因为它将创建许多新活动。但是,你可以在清单文件中将其声明为“singletask”。这样它将通过活动生命周期,但不会浪费资源来创建额外的活动实例。虽然对于你的实例来说这是不必要的,但如果你需要活动经历oncreate过程,这将实现该功能。 - Falmarri
通常当出现像这样与Java语法无关的奇怪错误时,这表明您的xml文件存在问题,这会阻止Android自动构建项目(生成R类)。如果您确定您的xml是正确的,请尝试以下操作:
  • 对一个xml文件进行一些更改并撤消以强制重新构建。
  • 在Eclipse中检查“问题”选项卡。如果错误在那里,请右键单击它,删除它,并强制重新构建。
  • 将您的代码复制到一个新项目中,看看是否可以在那里工作。
我自己从未遇到过这种情况;很抱歉我不能提供更多帮助。
- Andy Zhang
是的,看起来是构建问题。尝试在Eclipse中执行“清理”操作并重新构建项目。有时当Eclipse不知道需要重建R类时会出现这种情况。 - Falmarri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,