如何以编程方式更改Android活动的背景图像

9

我已经能够更改活动背景的颜色(请参见此帖子)。现在,一个要求是对背景图像进行相同的处理。我的意思是,我可以点击一个按钮,选择一个选项,并将当前Activity的背景图像更改为新的背景图像。

这是我所做的:

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();

使用以下代码保存和加载更改:

//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();
}

当从对话框列表中选择活动背景图像时,该图像确实会更改,但更改不会保存并在下次重新启动活动时加载。

我现在不知道如何解决这个问题。您能帮忙吗?非常感谢。


请解释一下,您想让用户在他们的端上更改图片吗?每当用户想要更改图片时,他们可以这样做吗?我的理解正确吗? - Farhan Shah
是的。这是一种阅读材料,用户可能想改变背景以满足他们的视力需求。 - Niamh Doyle
好的,那么您需要将该图像放入SD卡中。每当用户需要更改图像时,他只能在自己的SD卡中更改或替换图像。所以我是说图像将从客户端动态地更改。你明白我的意思吗?对不起,我的英语不太好。 - Farhan Shah
可能这是下一步。此时,我只关注如何保存和保留背景更改,以便当应用程序(或活动)下一次启动时,背景图像仍然存在。 - Niamh Doyle
这是建议,请尝试并告诉我是否有效...在您的saveSelectedItem(int which)方法中,请删除以下行,并在onCreate方法中实现,请尝试...如果(prefs == null) { prefs = PreferenceManager .getDefaultSharedPreferences(this); } - Farhan Shah
请参考下面的@Hamid Shatu。这是一个可能的解决方案。 - Niamh Doyle
3个回答

12

当您从对话框(Dialog)中选择后设置背景时,您将获得资源IDR.drawable.pix2并按以下方式检索BitmapDrawable...

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;

但是在onCreate()方法中,您只需要将资源id传递如下...

wvContent.setBackgroundColor(getSelectedItem());

在这里,getSelectedItem() 返回一个 int 值,代表一个资源 id。

现在,在 onCreate() 方法中如下设置背景图片...

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

您可以按以下方式从SD卡更新背景...

    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);

1
@HS 这就是我所说的。给你的 棒极了 的回答点个赞。 - M D
非常感谢你,@Hamid Shatu。这就解决了问题:现在它按照我的期望工作。我会接受你的回答,但如果你不介意,能否向我展示如何从“sdcard”选择图像作为背景,而不是从“drawable”中选择? - Niamh Doyle
1
尝试以下代码从SD卡中选择图像... String pathName = "/sdcard/nogastorebgimage.png"; Resources res = getResources(); Bitmap bitmap = BitmapFactory.decodeFile(pathName); BitmapDrawable bd = new BitmapDrawable(res, bitmap); RelativeLayout rl_main = (RelativeLayout) findViewById(R.id.rl_main); rl_main.setBackgroundDrawable(bd); - Farhan Shah
1
@HamidShatu,我给你点赞,你的回答很好! :) - Farhan Shah
1
@NiamhDoyle ...我认为,这个链接会更有帮助:http://viralpatel.net/blogs/pick-image-from-galary-android-app/ - Hamid Shatu
显示剩余4条评论

4

将以下代码添加到你的 activity.xml 文件中:

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

将以下代码添加到Activity.java文件中:

ImageView layout = (ImageView) findViewById(R.id.background);
            layout.setBackgroundResource(R.drawable.iso);

这个如何用于更改背景,如果用户想要的话? - Niamh Doyle
当将ImageView设置为is时,它将成为活动的背景。 - Mohammad Rababah

0
webView.setBackgroundColor(0);
WebView.setBackgroundResource(R.drawable.yourImage);

使用上述代码,希望能对您有所帮助...


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