如何将共享首选项值设置为布局

时间:2011-10-01 01:31:38

标签: android android-layout android-preferences

我已经将有关共享首选项的所有内容放在适当的位置,并且在我的一个活动中,我也能够在logcat中检索这样的共享首选项值。     String i = prefs.getString(“bgColor”,“#f2345”);     的System.out.println(ⅰ);

但是在这个活动中我使用的是这样的布局     SimpleCursorAdapter sca = new SimpleCursorAdapter(this,R.layout.country_row,                                         c,from,to);
        setListAdapter(SCA); 其中“country_row”是我的xml布局文件,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
android:orientation="horizontal">    

  <TextView android:id="@+id/year"
      android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff000099"
android:background="#ffffff80"
android:padding="10dp"
android:textSize="16sp"
android:text="1964"/>

<TextView android:id="@+id/country"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:textColor="#ffffff80"
android:background="#ff000099"
android:padding="10dp"
android:textSize="16sp"
android:text="Sweden"/>

现在使用我已从首选项中获取的值,我想在此处更改,例如显示的背景颜色或字体大小。我现在想要的只是将这些共享首选值隐含在我的布局xml文件中。我怎么能这样做,我无法做到这一点?


实际上,我可以从共享偏好中获取值,例如

boolean i = prefs.getBoolean("fontBold", false);
System.out.println(i);
if (i){
      TextView tv = (TextView)findViewById(R.id.year);
      tv.setTypeface(null, Typeface.BOLD);//null pointer 
}

在游标适配器中,我已经应用了布局country_row.xml。那么我如何使用我得到的布局的首选项值。我从复选框中获取的布尔值是正确的,因为我也打印出来看它。但是,当我尝试像上面那样做时它不起作用,程序崩溃说空指针异常。

我被困在这里的是....我得到了正确的偏好值但不知道如何使用它或将它应用到我现有的布局......或者我是否需要制作不同的布局..我不确定。

3 个答案:

答案 0 :(得分:1)

我认为您要做的是在代码中动态更改一些布局参数。 通常,您可以通过代码或.xml文件将属性设置为视图(Layout,TextView,EditText等)。 以布局为例。 首先在布局中添加id属性。

<LinearLayoout android:id="@+id/layoutID" .../>

然后

LinearLayout layout=(LinearLayout)findViewById(R.id.layoutID) //get the layout object.
layout.setBackgroundColor (color from your preferences);

以上是基本想法。请阅读SDK文档以查找信息。

答案 1 :(得分:0)

像黄回答一样, 1)您必须为必须更改属性的布局或视图创建引用。 2)之后获得偏好的值到各自的变量。 3)将值设置为该布局或视图以获得效果。

它会悄然发挥作用。有关更多参考,请参阅下面的示例,其中选中复选框,我可以执行一些操作,如播放音乐。

myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
    fullResultSound = myPrefs.getBoolean("FullResultIsOn", false);
    lessResultSound = myPrefs.getBoolean("LessResultIsOn", false);

    System.out.println("============================= The FullResultSound in Result Page is: "+fullResultSound);
    System.out.println("============================= The LessResultSound in Result Page is: "+lessResultSound);


if(fullResultSound)
        {
            playSound(soundFileForFullResult);
        }
        else
        {
            playSound();
        }

希望它对你有用。如果没有,请告诉我。

答案 2 :(得分:0)

实际上我是如何设法改变视图的布局的。     ContentResolver contentResolver = getContentResolver();

    Cursor c = contentResolver.query(CONTENT_URI, null, null, null, sortOrder);     
    String[] from = new String[] { "year", "country" };
    int[] to = new int[] { R.id.year, R.id.country };       
    SimpleCursorAdapter sca = new MySimpleCursorAdapter(this, R.layout.country_row,
            c, from, to);  
    setListAdapter(sca);

class MySimpleCursorAdapter  extends SimpleCursorAdapter{

    public MySimpleCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to) {
        super(context, layout, c, from, to);
        // TODO Auto-generated constructor stub
    }


    @Override   // Called when updating the ListView
    public View getView(int position, View convertView, ViewGroup parent) {
        /* Reuse super handling ==> A TextView from R.layout.list_item */
        View v =  super.getView(position,convertView,parent); 

        TextView tYear = (TextView) v.findViewById(R.id.year);
        TextView tCountry = (TextView) v.findViewById(R.id.country);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
        boolean font_size = prefs.getBoolean("fontSize", false);
        boolean italic_font = prefs.getBoolean("fontItalic", false);


        String listpref = prefs.getString("bgColor", "#ffffff80");
        //System.out.println(listpref);
        tYear.setBackgroundColor(Color.parseColor(listpref));
        tCountry.setBackgroundColor(Color.parseColor(listpref));


        if (font_size){
            tYear.setTextSize(25);
            tCountry.setTextSize(25);
        }


        if (italic_font){
            tYear.setTypeface(null, Typeface.ITALIC);
            tCountry.setTypeface(null, Typeface.ITALIC);
        }

        //tv.setBackgroundColor(col);

        return v;       
    }
}