2013-09-26 2 views
0

Я закодировал действие, которое, когда пользователь нажимает только кнопку, будет меняться случайным образом. Я поместил фоновое изображение в файл с возможностью рисования и создал массив этих изображений в значении. Вот что я получил в настоящее время:случайное изменение фона макета андроида

final LinearLayout background = (LinearLayout)findViewById(R.id.back); 
Button button = (Button)findViewById(R.id.button1); 
Resources res = getResources(); 
final TypedArray myImages = res.obtainTypedArray(R.array.image); 


    button.setOnClickListener(
      new Button.OnClickListener(){ 

     public void onClick(View v) { 
     // TODO Auto-generated method stub 

    Random r = new Random(myImages.length()); 
    int b = r.nextInt(); 
    background.setBackgroundResource(b); 


     } 
       }); 

и массив:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <array name="image"> 
    <item>@drawable/background</item> 
    <item>@drawable/background_blue</item> 
    <item>@drawable/background_pink</item> 
    <item>@drawable/background_orange</item> 
    </array> 
</resources> 

Это не кажется, ничего плохого, но каждый раз, когда я начинаю эмулятор, чтобы проверить, это всегда показывает, что деятельность остановлена

может ли кто-нибудь сказать мне, в чем проблема моего кода? Буду признателен!

TO: Ashok LogCat показать эту ошибку

E/AndroidRuntime(802): FATAL EXCEPTION: main     E/AndroidRuntime(802):java.lang.ArrayIndexOutOfBoundsException:length=456;index=1647793160 
E/AndroidRuntime(802):  at android.content.res.TypedArray.getResourceId(TypedArray.java:570) 
E/AndroidRuntime(802):  at com.example.cathy.MainActivity$1.onClick(MainActivity.java:39) 
E/AndroidRuntime(802):  at android.view.View.performClick(View.java:4240) 
E/AndroidRuntime(802):  at android.view.View$PerformClick.run(View.java:17721) 
E/AndroidRuntime(802):  at android.os.Handler.handleCallback(Handler.java:730) 
E/AndroidRuntime(802):  at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(802):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(802):  atandroid.app.ActivityThread.main(ActivityThread.java:5103) 
E/AndroidRuntime(802):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(802):  at java.lang.reflect.Method.invoke(Method.java:525) 
E/AndroidRuntime(802):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 

E/AndroidRuntime(802):  atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 

E/AndroidRuntime(802): at dalvik.system.NativeStart.main(Native Method) 
+2

вы видите erros, если так пожалуйста, напишите ваш LogCat – Ashok

+0

надлежащего отступа может сделать свой образец код более читаемым – krsteeve

+0

Что размер изображения, которые вы хотите установить в качестве фона? –

ответ

4

Попробуйте

final LinearLayout background = (LinearLayout) findViewById(R.id.back); 
Button button = (Button) findViewById(R.id.button1); 
Resources res = getResources(); 
final TypedArray myImages = res.obtainTypedArray(R.array.image); 
final Random random = new Random(); 

button.setOnClickListener(new Button.OnClickListener() { 

    public void onClick(View v) { 

     //Genrate a random index in the range 
     int randomInt = random.nextInt(myImages.length()); 

     // Generate the drawableID from the randomInt 
     int drawableID = myImages.getResourceId(randomInt, -1); 
     background.setBackgroundResource(drawableID); 
    } 
}); 
+0

Я следил за вашим методом, все еще не работает :( –

+0

Я отредактировал этот код в соответствии с вашим источником. – imranhasanhira

+0

СПАСИБО: SOOOOOOOOOOOO MUTCH !!! Он работает !! –

0

Проблема заключается в том, как вы используете setBackgroundResource(). Он ожидает целочисленное значение файла ресурса, а не индекса массива.

Посмотрите здесь, как получить значение из массива ресурсов: Getting String Array From Resources

редактировать: Извиняюсь, пропустил начало вашего кода. Попробуйте что-то вроде этого:

background.setBackgroundResource(myImages.getResourceId(b,-1)); 

Вы можете добавить проверку ошибок, чтобы увидеть, что getResourceId() возвращает первый, хотя.

Смежные вопросы