android 如何从sd卡中显示图片,动态修改背景图片

    
    在主界面时,我设置了一个更换主界面的按钮,的确通过setBackgroundResource(R.drawable.bgimg2);可以成功设置背景,但是现在我有一个需求是:打开手机sd卡中的图片显示在另一个activity中,用户经过长按图片,弹出对话框:设置为主界面背景,但是通过setBackgroundResource(R.drawable.bgimg2);这句代码无法修改主界面的背景,请问该如何解决?
   我的解决方案:
     利用LayoutInflater是没用的,是因为你在别的activity获得的主界面xml的对象,只是一个复制,无法影响原来的xml配置,所以无法修改。现在我想到的是当从sd卡显示出图片时,长按进行主界面背景图片的设置后,把图片的uri转到主界面,在主界面进行设置,就ok了,有什么不妥请指教!!!
 
   这是在eoe android社区,一个大侠给我的解决思路,很好,谢谢了那位大侠:
 
 
我已经写了个Demo来验证过了。现把我的思路给你说下,辅以代码,你应该能看得懂:
1、主界面只有个按钮,用来提示用户选择图片来进行设置:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
    android:id= "@+id/container"
    android:layout_width= "match_parent"
    android:layout_height= "match_parent" >
 
    <Button
         android:layout_width= "wrap_content"
         android:layout_height= "50dp"
         android:text= "点击设置背景图片"
         android:textSize= "30sp"
         android:onClick= "setBackground" />
 
</RelativeLayout>


2、设置主界面,为Button添加事件:
代码片段,双击复制
01
02
setContentView(R.layout.activity_main);
                container = (RelativeLayout) findViewById(R.id.container);



代码片段,双击复制
01
02
03
04
05
         
public void setBackground(View view) {
                Intent intent = new Intent( this , ImageGallery. class );
                startActivityForResult(intent, 1 );
        }


3、为获取用户选择的图片,需要复写onActivityResult方法:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
@Override
        protected void onActivityResult( int requestCode, int resultCode, Intent data) {
                super .onActivityResult(requestCode, resultCode, data);
                if (requestCode== 1 && resultCode== RESULT_OK) {
                        Bundle bundle = data.getExtras();
                        String url = bundle.getString( "url" );
                        Uri uri = Uri.parse(url);
                        container.setBackgroundDrawable(Drawable.createFromPath(uri.getPath()));
                }
        }


4、在图片选择的界面,我只是简单实用了Gallery控件来显示界面,有关图片内存溢出问题暂未考虑:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?xml version= "1.0" encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
    android:layout_width= "match_parent"
    android:layout_height= "match_parent"
    android:layout_gravity= "center_horizontal"
    android:orientation= "vertical" >
    <Gallery
         android:id= "@+id/gallery"
         android:layout_width= "match_parent"
         android:layout_height= "0dp"
         android:layout_weight= "1.0"
         android:padding= "15dp" />
    <TextView
         android:text= "长按图片可以将其设置为背景"
         android:gravity= "center"
         android:textSize= "20sp"
         android:layout_width= "match_parent"
         android:layout_height= "wrap_content" />
 
</LinearLayout>



代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
setContentView(R.layout.image_gallery);
                imageGallery = (Gallery) findViewById(R.id.gallery);
                imagePath = Environment.getExternalStorageDirectory().getPath() + "/image" ; //SDCard中存放图片的目录
                File imageDir = new File(imagePath);
                 
                if (!imageDir.exists()) {
                        imageDir.mkdirs();
                }
                imageFiles = imageDir.list( new FilenameFilter(){ //获取所有的图片名称
 
                        @Override
                        public boolean accept(File dir, String filename) {
                                return (filename.endsWith( ".jpg" )
                                                || filename.endsWith( ".jpeg" )
                                                || filename.endsWith( ".png" )) ;
                        }});
                imageGallery.setAdapter( new GalleryAdapter( this ));
                imageGallery.setOnItemLongClickListener( new OnItemLongClickListener(){
 
                        @Override
                        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                        final int arg2, long arg3) {
                                new AlertDialog.Builder(ImageGallery. this ).setTitle( "温馨提示" )
                                .setIcon(android.R.drawable.ic_dialog_info)
                                .setMessage( "确定要将其设置为背景吗?" )
                                .setNegativeButton( "取消" , null )
                                .setPositiveButton( "确定" , new OnClickListener(){
 
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                                Intent intent = getIntent();
                                                Bundle bundle = new Bundle();
                                                bundle.putString( "url" , Uri.fromFile( new File(imagePath + "/" +imageFiles[arg2])).toString());
                                                intent.putExtras(bundle);
                                                setResult(RESULT_OK, intent);
                                                ImageGallery. this .finish();
                                        }}).show();
                                return true ;
                        }});


5、Gallery的Adpater如下:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
@Override
                public View getView( int position, View convertView, ViewGroup parent) {
                        position = position%imageFiles.length;
                        ViewHolder viewHolder;
                        if (convertView == null ) {
                                viewHolder = new ViewHolder();
                                convertView = inflater.inflate(R.layout.image_item, null );
                                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);
                                convertView.setTag(viewHolder);
                        } else {
                                viewHolder = (ViewHolder) convertView.getTag();
                        }
                        viewHolder.imageView.setBackgroundDrawable(Drawable.createFromPath(imagePath + "/" + imageFiles[position]));
                         
                         
                        return convertView;
                }


6、通过以上步骤,可以效果图:    其实最关键是: relalayout.setBackgroundDrawable(Drawable.createFromPath(uri.getPath()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值