2013-02-26 4 views
0

У меня есть несколько изображений в массиве под названием pics.Where я называю wallpapermanager ?? Скажите, пожалуйста, как создать обои при щелчке изображения. Я знаю, что мне нужно создать OnCickLisener в представлении изображения, а затем использовать wallpapermanager для вызова image.but, так как изображения находятся в массиве, как я вызываю тот конкретный образ, который нажал? Поскольку он не будет в R.drawable , Вот мой код:Как вы устанавливаете обои, если ваши изображения хранятся в массиве?

public class Rd extends Activity { 
    Integer [] pics= { 
     R.drawable.rd1, 
     R.drawable.rd2, 
     R.drawable.rd3, 
     R.drawable.rd4, 
     R.drawable.rd5, 


    }; 
    ImageView imageView; 




    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dravid); 
     Gallery ga = (Gallery)findViewById(R.id.Gallery01); 
    ga.setAdapter(new ImageAdapter(this)); 

    imageView = (ImageView)findViewById(R.id.ImageView01); 
    ga.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       Toast.makeText(getBaseContext(), 
      "You have selected picture " + (arg2+1) +"of Rd", 
         Toast.LENGTH_SHORT).show(); 
       imageView.setImageResource(pics[arg2]); 



      } 

     }); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_dd, menu); 
     return true; 
    } 
    public class ImageAdapter extends BaseAdapter { 

    private Context ctx; 
    int imageBackground; 

    public ImageAdapter(Context c) { 
      ctx = c; 
      TypedArray ta = obtainStyledAttributes(R.styleable.Gallery1); 
      imageBackground = ta.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 1); 
      ta.recycle(); 
     } 

     @Override 
    public int getCount() { 

     return pics.length; 
    } 

    @Override 
    public Object getItem(int arg0) { 

     return arg0; 
    } 

    @Override 
    public long getItemId(int arg0) { 

     return arg0; 
    } 

    @Override 
    public View getView(int arg0, View arg1, ViewGroup arg2) { 
     ImageView iv = new ImageView(ctx); 
     iv.setImageResource(pics[arg0]); 
     iv.setScaleType(ImageView.ScaleType.FIT_XY); 
     iv.setLayoutParams(new Gallery.LayoutParams(200,120)); 
     iv.setBackgroundResource(imageBackground); 
     return iv; 
    } 

    } 
} 

Вот трассировки стека от силы близко:

2-26 21:22:02.817: I/Process(440): Sending signal. PID: 440 SIG: 9 
02-26 21:23:04.677: D/dalvikvm(472): GC_EXTERNAL_ALLOC freed 53K, 52% free 2586K/5379K, external 1012K/1038K, paused 70ms 
02-26 21:23:09.967: D/AndroidRuntime(472): Shutting down VM 
02-26 21:23:09.967: W/dalvikvm(472): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
02-26 21:23:09.990: E/AndroidRuntime(472): FATAL EXCEPTION: main 
02-26 21:23:09.990: E/AndroidRuntime(472): java.lang.SecurityException: Access denied to process: 472, must have permission android.permission.SET_WALLPAPER 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.os.Parcel.readException(Parcel.java:1322) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.os.Parcel.readException(Parcel.java:1276) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.app.IWallpaperManager$Stub$Proxy.setWallpaper(IWallpaperManager.java:179) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.app.WallpaperManager.setResource(WallpaperManager.java:448) 
02-26 21:23:09.990: E/AndroidRuntime(472): at com.wallpaper.rahul.dravid.RahulDravid$1$1.onClick(RahulDravid.java:141) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.view.View.performClick(View.java:2485) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.view.View$PerformClick.run(View.java:9080) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.os.Handler.handleCallback(Handler.java:587) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.os.Looper.loop(Looper.java:123) 
02-26 21:23:09.990: E/AndroidRuntime(472): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-26 21:23:09.990: E/AndroidRuntime(472): at java.lang.reflect.Method.invokeNative(Native Method) 
02-26 21:23:09.990: E/AndroidRuntime(472): at java.lang.reflect.Method.invoke(Method.java:507) 
02-26 21:23:09.990: E/AndroidRuntime(472): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-26 21:23:09.990: E/AndroidRuntime(472): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-26 21:23:09.990: E/AndroidRuntime(472): at dalvik.system.NativeStart.main(Native Method) 
02-26 21:28:10.137: I/Process(472): Sending signal. PID: 472 SIG: 9 
+0

Информация в трассировке стека говорит вам именно то, что проблема есть. Найдите эту строку в трассировке стека 'java.lang.SecurityException: доступ запрещен для обработки: 472, должно иметь разрешение android.permission.SET_WALLPAPER' Это говорит вам, что вам нужно иметь разрешение SET_WALLPAPER Security, чтобы иметь возможность установить обои пользователей. добавьте тег разрешения использования в ваш манифест, чтобы объявить 'android.permission.SET_WALLPAPER' – FoamyGuy

ответ

1

вы должны иметь возможность ссылаться из массива, так же, как вы делали, когда вы устанавливаете вид изображения ,

ga.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int pos,long id) { 
     Toast.makeText(v.getContext(), "You have selected picture " + (pos+1) +"of Rd", 
      Toast.LENGTH_SHORT).show(); 
     imageView.setImageResource(pics[pos]); 
     imageView.setOnClickListner(new OnClickListener() { 
      public void onClick(View v) { 
      WallpaperManager wm = WallpaperManager.getInstance(v.getContext()); 
      try { 
       wm.setResource(pics[pos]); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      } 
     }); 
    } 
}); 

Я предлагаю вам привыкнуть переименовывать автоматически сгенерированные имена переменных в нечто более наглядное. Ваш код очень запутанным с arg0, arg1 и т.д ...

Кроме того, при создании Toast нет никакой необходимости использовать getBaseContext() Вы должны использовать либо YourActivity.this или v.getContext()

+0

Хорошо, я буду помнить об этом! Спасибо! Когда я выполняю код, он принудительно закрывается каждый раз, когда я нажимаю на изображение! Любая идея, почему это происходит? –

+0

отредактируйте ваш вопрос и включите stacktrace из вашего логарифма при его сбое. – FoamyGuy

+0

эта часть не имеет отношения к вашей проблеме. Найдите большой блок красного текста, который говорит что-то об исключении. и когда вы обнаружите, что редактируете свой вопрос и публикуете его там, форматирование комментариев не делается для этого. – FoamyGuy