2012-04-30 120 views
0

我有一个TableLayout,每个TableRow中都有很多按钮。在XML中,每个按钮看起来是这样的:永久更改按钮图像

<Button 
     android:id="@+id/a1" 
     android:text="Button1" 
     android:textColor="#FFFFFF" 
     android:textSize="10sp" 
     android:background="#000000" 
     android:drawableTop="@drawable/image1" /> 

在我的应用程序,我已经在活动,这是用来“添加到收藏夹”按钮的选项。问题是,如何永久更改按钮图像(即使用户离开应用程序),直到用户再次按下该选项(从收藏夹中删除)?我想我必须使用sharedpreferences,但我无法弄清楚如何去做。

非常感谢!

回答

1

SharedPreference只是一个文件,您可以保存和检索值。这里有您的活动使用SharedPreference最简单的步骤:

你需要做一个变量sP这将在SharedPreferences文件指向你将使用:

SharedPreferences sP = getSharedPreferences("MyPrefs", MODE_PRIVATE); 

你需要做一个变量sPeD其将在“编辑”该文件指出,这将让你把值到该文件:

SharedPreferences.Editor sPeD = sP.edit(); 

然后,您可以从文件中提取存储的值。该值通过“钥匙”这仅仅是一个String您定义的索引:

String myString = sP.getString("keyTextYouDefine", "Oops!"); 

如果没有存储在关键"keyTextYouDefine"值,那么getString()会让myString等于"Oops!"

为了存储在该键的值,使用:

sPeD.putString("keyYouDefine","The string I want to save."); 
    sPeD.commit(); 

如果你忘记做commit()你把东西之后的文件中,那么他们实际上并没有放在那里。

这应该会让你顺利地走上正轨。

后来补充:

然后,您可以用它来确定哪些图像上的按钮。

假设你已经propertly定义你的按钮

Button button = findViewById(R.id.myButton) // or whatever you are actually using 

无论从任何然后设置图像,如果有什么是存储在ShardPreference

int which = sP.getInt("WhichImage", 1); // assuming image1 is the "default" 
    switch (which) { 
     case 1: 
      button.setCompoundDrawables(null, @drawable/image1, null, null); 
      break; 
     case 2: 
      button.setCompoundDrawables(null, @drawable/image2, null, null); 
      break; 
     default: // no image 
    } 

在别处在您的活动,当你做出决定切换按钮图像到image2:

if (whatever) { // condition for changing to image 2 
     button.setCompoundDrawables(null, @drawable/image2, null, null); 
     sP.edit().putInt("WhichImage", 2).commit(); 
    } 

我从来没有用过setCompoundDrawables()我自己,所以你的里程可能会有所不同。

+0

感谢您的回答!但是,我如何使用Sharedpreferences来存储这个“映像更改”? – Varki

+0

请参阅使用添加的信息编辑。 – mwengler

+0

非常感谢!现在完美的作品! :) – Varki

0

共享偏好是用于显而易见的。

您可以在共享偏好从这里link1link2得到教程,Developer Site

需要实现的东西是如下。

在共享首选项中存储字符串。将其命名为buttonImageData。使用媒体商店类查找使用MediaStore.Audio.Media._ID存储的所有歌曲的_id。

将所有此ID存储在整数数组中。 然后,当应用程序关闭存储_id所有具有标记符号的歌曲时,以“”(空格)作为分隔符。简单的循环和字符串附加功能将解决。

当应用程序再次启动时,获取sharedpreference中的字符串。使用以下种代码获取的所有歌曲的_id

产生会像buttonImageData = “23 43 42 54 12 567 653 234 543” 在机器人,Mediaprovider提供了数据库中的字符串中,乐曲拥有独特的permament _id,因此,即使名称或歌曲文件的任何属性发生更改,保持_id的轨道也有助于使应用程序健壮。

StringTokenizer st = new StringTokenizer(buttonImageData); 
    while (st.hasMoreTokens()) { 
     array[i++]=Integer.parseInt(st.nextToken()); 
    } 

现在很简单,你有所有用户标记的所有歌曲的_id数组。所以更新按钮

我希望你有这个。如果有任何查询请求。据我所知,这是最有效的方法。

+0

谢谢你的回答!我现在明白了! – Varki

+0

欢迎!如果我的方法起作用,则通过单击左侧的V标记接受答案。它会引导他人。 :) –