web-dev-qa-db-fra.com

Comment modifier par programme l'image de fond d'une activité Android

J'ai été en mesure de changer la couleur d'un fond d'activité (voir ce post ). Maintenant, il est nécessaire de faire la même chose avec l'image d'arrière-plan. Je veux dire que je peux cliquer sur un bouton, sélectionner une option et changer l'image d'arrière-plan de l'activité en cours pour la nouvelle.

Voici ce que j'ai fait:

private SharedPreferences prefs;    
private static final String SELECTED_ITEM = "SelectedItem"; 
private Editor sharedPrefEditor;

btnchangeColor = (ImageButton) findViewById(R.id.btnchangeColor);
btnchangeColor.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
    final CharSequence[] items={getString(R.string.default),getString(R.string.pix1), getString(R.string.pix2))};
    AlertDialog.Builder builder = new AlertDialog.Builder(
            ContentView.this);

    builder.setTitle((getResources().getString(R.string.color_switch)));
    builder.setPositiveButton((R.string.ok), new DialogInterface.OnClickListener() { 

        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });

    builder.setSingleChoiceItems(items, getSelectedItem(), new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {                
            wvContent = (WebView) findViewById(R.id.wvContent);             
            int bg_color=0;

            if(getString(R.string.default).equals(items[which]))
            {                   
                wvContent.setBackgroundColor(0);
                BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.default);
                bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
                wvContent.setBackgroundDrawable(bg);                    
                bg_color=R.drawable.default; 
            }
            else if(getString(R.string.pix1).equals(items[which]))
            {
                wvContent.setBackgroundColor(0);
                BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.pix1);
                bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
                wvContent.setBackgroundDrawable(bg);                    
                bg_color=R.drawable.pix1;
                }
            else if(getString(R.string.pix2).equals(items[which]))
            {
                wvContent.setBackgroundColor(0);
                BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.pix2);
                bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
                wvContent.setBackgroundDrawable(bg);                    
                bg_color=R.drawable.pix2;                   
                }               
            saveSelectedItem(bg_color);
        }
    });
    builder.show();

Les modifications sont enregistrées et chargées à l’aide du code suivant:

//OnCreate
wvContent = (WebView) findViewById(R.id.wvContent); 
wvContent.setBackgroundColor(getSelectedItem());
...
private int getSelectedItem() {
    if (prefs == null) {
        prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
    }
    return prefs.getInt(SELECTED_ITEM, -1);
}

private void saveSelectedItem(int which) {
    if (prefs == null) {
        prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
    }
    sharedPrefEditor = prefs.edit();
    sharedPrefEditor.putInt(SELECTED_ITEM, which);
    sharedPrefEditor.commit();
}

L'image d'arrière-plan d'activité change lorsqu'elle est sélectionnée dans la liste de dialogue, MAIS la modification n'est pas enregistrée ni chargée lors de la prochaine relance de l'activité.

Je ne sais pas maintenant comment résoudre ce problème. Peux-tu aider s'il te plait? Merci beaucoup. 

6
Niamh Doyle

Lorsque vous définissez l'arrière-plan après avoir sélectionné Dialog, vous obtenez l'ID de ressource R.drawable.pix2 et récupérez la BitmapDrawable comme suit ...

wvContent.setBackgroundColor(0);
BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.pix2);
bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
wvContent.setBackgroundDrawable(bg);                    
bg_color=R.drawable.pix2;

Mais dans la méthode onCreate(), vous ne faites que transmettre l'ID de la ressource comme ci-dessous ...

wvContent.setBackgroundColor(getSelectedItem());

où, getSelectedItem() renvoie une valeur int qui est un identifiant de ressource.

Maintenant, définissez l’arrière-plan dessinable comme suit dans la méthode onCreate() ...

wvContent.setBackgroundColor(0);
BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(getSelectedItem());
bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
wvContent.setBackgroundDrawable(bg);

Vous pouvez mettre à jour l’arrière-plan depuis la SDCard comme suit.

    String pathName = Environment.getExternalStorageDirectory().getPath() + "/folder/" + "image.jpg";
    Resources res = getResources(pathName);
    Bitmap bitmap = BitmapFactory.decodeFile(pathName);
    BitmapDrawable backgroundDrawable = new BitmapDrawable(res, bitmap);
    wvContent.setBackgroundDrawable(backgroundDrawable);
12
Hamid Shatu

ajoutez ceci à votre activity.xml:

<ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:background="@drawable/iso"
        Android:id="@+id/background"
        Android:scaleType="fitXY"
        />

ajoutez ceci à activity.Java:

ImageView layout = (ImageView) findViewById(R.id.background);
            layout.setBackgroundResource(R.drawable.iso);
4
mohammad rababah
webView.setBackgroundColor(0);
WebView.setBackgroundResource(R.drawable.yourImage);

utilisez ce code ci-dessus, cela peut vous aider ....

0
prakash