android学习日记:手机主界面背景的修改

       最近刚刚开始工作,对android由一窍不通到现在慢慢懂得一丢丢。今天起,记录自己学习中的点点滴滴。

       android的原生workspace可以设定wallpapers,但是一旦进入应用界面之后,背景就会变成纯黑。如果可以让应用界面的背景也和桌面的wallpaper一样该多好。于是我就在menu选项中添加了一个新的按钮组,用来实现我的backgroundsettings。

       改动是在android的源码上进行的。主要对象就是packages/app/Launcher2目录。大概思路分以下几步:

1。在Launcher.java中添加新的按钮组。

2。让该按钮在桌面时隐藏,进入应用界面后显示。

3。设置按钮单击事件。

4。增加选择界面,并使该届面返回选项数值,然后在Launcher.java中根据返回值设定background。

主要代码如下:

in Launcher.java:

private static final int MENU_GROUP_WALLPAPER = 1;           
private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1;
private static final int MENU_MANAGE_APPS = MENU_WALLPAPER_SETTINGS + 1;
private static final int MENU_SYSTEM_SETTINGS = MENU_MANAGE_APPS + 1;
private static final int MENU_HELP = MENU_SYSTEM_SETTINGS + 1;
private static final int MENU_GROUP_BACKGROUND= 2;          //这里引入背景设置按钮组
private static final int MENU_BACKGROUND_SETTINGS = MENU_SYSTEM_SETTINGS + 1;
...
private static final int REQUEST_PICK_BACKGROUND = 11;      //为将来的startActivityForResult设定标签
...
  

@Override

protected void onActivityResult(final int requestCode, int resultCode, final Intent data) {        //重写onActivityResult方法,在其中修改背景图片
if (resultCode == RESULT_OK && mPendingAddInfo.container != ItemInfo.NO_ID) {
            final PendingAddArguments args = new PendingAddArguments();
            args.requestCode = requestCode;
            args.intent = data;
            args.container = mPendingAddInfo.container;
            args.screen = mPendingAddInfo.screen;
            args.cellX = mPendingAddInfo.cellX;
            args.cellY = mPendingAddInfo.cellY;

            if (isWorkspaceLocked()) {
                sPendingAddList.add(args);
            } else {
                delayExitSpringLoadedMode = completeAdd(args);
            }
        }else if((requestCode) == REQUEST_PICK_BACKGROUND){             
                Bundle b = data.getExtras();
                int num = b.getInt("wallpaper");                        //获得特定的返回标签值
                if(1 == num){     
                    AppsCustomizeTabHost ACT = (AppsCustomizeTabHost)findViewById(R.id.apps_customize_pane);    //获得背景
                    LinearLayout ll = (LinearLayout)ACT.findViewById(R.id.apps_customize_content);              //的布局文件
                    ll.setBackgroundResource(R.drawable.wallpaper_bubblegum);                                   //设定背景为wallpaper_bubblegum
                    }
            }
...
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case MENU_WALLPAPER_SETTINGS:
            startWallpaper();
            return true;
        case MENU_BACKGROUND_SETTINGS:              // 监听按钮事件
            startBackground();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
...
    private void startBackground(){                 //发送Intent,转入settings界面
        final Intent pickBackground = new Intent(Launcher.this, BackgroundSettings.class);
        startActivityForResult(pickBackground,REQUEST_PICK_BACKGROUND);              //使用startActivityForResult用来获得选择背景图片的信息
        }

下面的是BackgroundSettings.java:

private Intent intent;
    private Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.background_settings);
        button = (Button)findViewById(R.id.background_to_wallpaper);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                intent = new Intent(BackgroundSettings.this, Launcher.class);
                intent.putExtra("wallpaper", 1);              //添加一对返回用的键值
                setResult(RESULT_OK,intent);                  //设定返回值
                finish();                                     //finish之后intent就会被发出,然后Launcher总的onActivityResult就会被调用
            }
        });
    }
     @Override

    public void onBackPressed() {                             //如果这里不重写onBackPressed方法,就会在按动返回按钮时使整个Launcher应用崩溃。。。

       // TODO Auto-generated method stub
            intent = new Intent(BackgroundSettings.this, Launcher.class);
            intent.putExtra("wallpaper", 0);
            setResult(RESULT_OK,intent);
            finish();

    }

初步做出来的效果对比:

android学习日记:手机主界面背景的修改_第1张图片android学习日记:手机主界面背景的修改_第2张图片

由于我是在两个手机上弄的对比,一个是中文,一个是纯英文的。。。
现在只是加了一张图片用来实现功能,以后有时间了会将系统的wallpaperchooser界面导入到backgroundsetting中,这样就会美观一些。
接下来就是学习拖放功能的实现以及service监听的具体应用,然后完善这个小程序了。

你可能感兴趣的:(android学习日记:手机主界面背景的修改)