2013-12-20 33 views
2

我在Android开发新的,我已经看了看周围的几个代码合并,但没有运气..应用当按钮被按下它随机挑选的图像从绘制文件夹

所以我想创建一个Android应用程序,当按下按钮时,它随机从可绘制文件夹中选取图像,并且不能再按下按钮30秒。

任何帮助将受到欢迎。

Randomactivity.java

package com.example.no; 

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.img1, 
      R.drawable.img2, 
      R.drawable.img3, 
      }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    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.main, menu); 
       return true; 
     } 
@Override 
public boolean onOptionsItemSelected (MenuItem item) { 
       switch (item.getItemId()) { 
       case R.id.action_settings: 
         startActivity(new Intent(this, MainActivity.class)); 
         return true; 
} 

return false; 
     } 

} 

- activity_main.xml中

<?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/bgi" 
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> 

-

+0

请大家付出努力,我们不会只给你代码 –

回答

1

在声明:

final Random rnd = new Random(); 
ImageView img = null; 
Button btnRandom = null; 

在主要活动:

@Override 
protected void onCreate(
    final Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.rnd_images); 
    img = (ImageView) findViewById(R.id.imgRandom); 
    btnRandom = (Button) findViewById(R.id.btnRandom); 
} 

protected final static int getResourceID 
(final String resName, final String resType, final Context ctx) 
{ 
    final int ResourceID = 
     ctx.getResources().getIdentifier(resName, resType, 
      ctx.getApplicationInfo().packageName); 
    if (ResourceID == 0) 
    { 
     throw new IllegalArgumentException 
     (
      "No resource string found with name " + resName 
      ); 
    } 
    else 
    { 
     return ResourceID; 
    } 
} 

public void clickHandler(final View v) 
{ 
    switch(v.getId()) 
    { 
     case R.id.btnRandom: 
     { 
      if (!btnRandom.isEnabled()) 
      { 
       return; 
      } 

      // I have 3 images named img_0 to img_2, so... 
      final String str = "img_" + rnd.nextInt(2); 
      img.setImageDrawable 
      (
       getResources().getDrawable(getResourceID(str, "drawable", 
        getApplicationContext())) 
      ); 
      btnRandom.setEnabled(false); 

      new CountDownTimer(5000, 1000) // Wait 5 secs, tick every 1 sec 
      { 
       @Override 
       public final void onTick(final long millisUntilFinished) 
       { 
        btnRandom.setText("Wait: " + (millisUntilFinished/1000)); 
       } 
       @Override 
       public final void onFinish() 
       { 
        btnRandom.setText("Change!"); 
        btnRandom.setEnabled(true); 
       } 
      }.start(); 

      break; 
     } 
    } 
} 

布局(rnd_images.xml

<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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" 
    > 
    <ImageView 
     android:id="@+id/imgRandom" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
    /> 
    <Button 
     android:id="@+id/btnRandom" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Change!" 
     android:onClick="clickHandler" 
    /> 
</RelativeLayout> 

[编辑]

我修改了layout中的按钮定义。而且我看到时机不受尊重,所以我要解决它。

我也修复了代码以正确处理时间。

[重新编辑]

我修改对clickHandler函数来显示剩余的宽限期,然后单击

+0

到目前为止只试过这个,但是它在屏幕左下角的按钮开始时给我白屏,修复.. – GrayFox

+0

你把** img_0 **,...,** img_(total-1)**放在res/drawable文件夹中吗?总-1是(很明显)是你的图像的总数 - 1 –

+0

我修复了我的代码和我的布局。现在它正在工作 - 时间部分没有让它正常工作。 –

0

嗯,我能想到的唯一的事情就是:

1 )从drawable目录获取所有资源并将它们放入一个N排列或列表

2)具有随机生成数和使用,作为一个指标来挑选图像的一条从阵列/列表

要获得所有的资源,你可能需要找到一个方法来做到它。 找了一下,这可能有所帮助:Android: retrieving all Drawable resources from Resources object

一旦你有一个列表包含所有这些资源,你将需要解决你想要的逻辑。

使用此来生成随机数:How do I generate random integers within a specific range in Java?

Button btn = (Button) findViewById(R.id.button); 
btn.setOnClickListener(new OnClickListener() { 
    public void onClick() { 
    // assume you put all resources into `resourcesList` 
    // `randInt` is the method from the link I gave you 
    resourcesList.get(randInt(0, listSize)); 

    btn.setEnabled(false); 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
     Thread.sleep(30000); // you might need to wrap this with try and catch 
     return null; 
     } 

     @Override 
     protected void onPostExecute(Void res) { 
     btn.setEnabled(true); 
     } 
    }.execute(); 
    } 
}); 

另一种方式做,这是使用handler.postDelayed

Handler h = new Handler(); 
btn.setOnClickListener(... 
    public void onClick() { 
    btn.setEnabled(false); 
    h.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     // no need to wrap this in `runOnUiThread` if you create do 
     // `Handler h = new Handler()` inside a UI thread 
     btn.setEnabled(true); 
     } 
    }, 30000); 
    } 
); 

P.S. AsyncTask可能会产生内存泄漏:Android: Memory leak due to AsyncTask。不知道Handler,你得做一些研究,它

0
  1. 你应该改变图像的名称以及发生火灾后第一次没有任何延迟你的可绘制的数组(这两个参数一样应该是数值常见的,所以你可以很容易地改变图像)
  2. 然后得到从随机数产生的值
相关问题