How to change imageview background color in a pref

2019-09-08 23:35发布

I tried to solve my problem so i changed so much code. I change even title of the post. I can change the color of imageview background in preferences ui successfully. But after leaving fragment and launch again, the ui can not be updated in the same way as before.

First of all, I use sherlockactionbar . There are 3 tabs . when 3rd bar is pressed, a fragment is , including buttons, is loaded. When one of button is pressed, another preference fragment is loaded.

The code below shows how to call preference fragment when one of the button is pressed : SettingsMenuFragment.java

public class SettingsMenuFragment extends SherlockFragment   {  
@Override  
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   Button ICSbutton= (Button) view.findViewById(R.id.CallSearchSettingsButton);                 
      ICSbutton.setOnClickListener(new View.OnClickListener() 
      {
          @Override
          public void onClick(View v) 
          {

                clearFragmentStack();
                SettingsIncomingSearchFragment removeSISF = (SettingsIncomingSearchFragment) getActivity().getSupportFragmentManager().findFragmentByTag("SISF");
                if(removeSISF != null)
                {
                    getActivity().getSupportFragmentManager().beginTransaction().remove(removeSISF).commit() ;
                    getActivity().getSupportFragmentManager().executePendingTransactions();
                }
                SettingsIncomingSearchFragment Prefrag = new SettingsIncomingSearchFragment();
                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(android.R.id.content, Prefrag ,"SISF");                 
                transaction.addToBackStack(null);
                transaction.commit();
                getActivity().getSupportFragmentManager().executePendingTransactions();           

          }
      } );}}

and the code below shows preferencefragment :

public class SettingsIncomingSearchFragment extends PreferenceListFragment  implements  SharedPreferences.OnSharedPreferenceChangeListener,PreferenceListFragment.OnPreferenceAttachedListener {

Context ctx ;
public static final String SHARED_PREFS_NAME = "settings";   
LinearLayout mainlayout ;
LinearLayout sublayout ;
View view ;
Preference myPref ;
ImageView img ;
SharedPreferences sp ;


@Override
public void onCreate(Bundle icicle) {


    ctx = getActivity() ;       
    super.onCreate(icicle); 
    addPreferencesFromResource(R.xml.pref_incomingsearchsettings); 
    myPref = (Preference) findPreference("incomingsearchbackgroundcolor");
    setColor() ;      

    myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                 public boolean onPreferenceClick(Preference preference) {                       

                     HSVColorPickerDialog cpd = new HSVColorPickerDialog( ctx, 0xFF4488CC, new OnColorSelectedListener() {
                            @Override
                            public void colorSelected(Integer color) 
                            {
                                sp.edit().putString("incomingsearchbackgroundcolor", String.valueOf(color)).commit();                               
                            }
                        });
                        cpd.setTitle( "Pick a color" );
                        cpd.show();
                     return true ; 

                 }
             });        
}

private void setColor() {
    // TODO Auto-generated method stub
     LayoutInflater inflater =  (LayoutInflater)
                getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.rectangle_layout, null);
        mainlayout = (LinearLayout)view.findViewById(R.id.rectangle_main_layout_ll);
        sublayout = (LinearLayout)mainlayout.findViewById(R.id.rectangle_layout_ll);            
        sp = ctx.getSharedPreferences(SHARED_PREFS_NAME, ctx.MODE_PRIVATE);         
        String defValue = null ;      
        defValue = sp.getString("incomingsearchbackgroundcolor", null);
        img = (ImageView)sublayout.findViewById(R.id.iv_priority);
        img.setBackgroundColor(Integer.parseInt(defValue));
}



@Override
public void onPreferenceAttached(PreferenceScreen root, int xmlId) {
    // TODO Auto-generated method stub

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    // TODO Auto-generated method stub
    if(key.equals("incomingsearchbackgroundcolor"))
    {       
     sp = ctx.getSharedPreferences(SHARED_PREFS_NAME, ctx.MODE_PRIVATE);
     String defValue = null ;
     defValue = sp.getString("incomingsearchbackgroundcolor", null);      
     Log.d("Debug", defValue);
     int iColor = Integer.parseInt(defValue);
     img.setBackgroundColor(iColor);  
     img.invalidate();

        if(this.isAdded())
        {            
            getActivity().getSupportFragmentManager().beginTransaction().detach(this).commit() ;
            getActivity().getSupportFragmentManager().executePendingTransactions();
            getActivity().getSupportFragmentManager().beginTransaction().attach(this).commit();
            getActivity().getSupportFragmentManager().executePendingTransactions();
        }        
    }

}

@Override
public void onResume() 
{
    super.onResume();
    sp.registerOnSharedPreferenceChangeListener(this);

}

@Override
public void onPause() {
    super.onPause();
    sp.unregisterOnSharedPreferenceChangeListener(this);
}

}

and this is preference xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:summary = "Options" android:title = "OPTIONS"  android:key="options">
    <CheckBoxPreference android:key="IncomingCallSearch" android:summary="On/Off" android:title="Enable Incoming Call Search" android:defaultValue="true"/>
</PreferenceCategory>
<PreferenceCategory android:summary = "Screen Settings" android:title = "Screen settings" android:key="ScreenSettings"  >
<ListPreference 
      android:entries="@array/screenLocOptions"
      android:entryValues="@array/screenLocValues"
      android:key="incomingcallsearch_screenlocation"
      android:title="Location" 
      android:defaultValue="Top"/>

<Preference

        android:defaultValue="0xFF000000"
        android:key="incomingsearchbackgroundcolor"            
        android:title="Background Color"            
        android:layout="@layout/rectangle_layout" />
</PreferenceCategory>

and this is the rectangle_layout xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:padding="5dp"
              android:id="@+id/rectangle_main_layout_ll">
   <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:text="Background color" 
        android:layout_weight= "0.9"/>

    <LinearLayout 
        android:layout_width="50dp"
        android:layout_height="50dp"            
        android:orientation="vertical" 
        android:layout_weight= "0.1"
        android:id="@+id/rectangle_layout_ll">
           <ImageView 
            android:id="@+id/iv_priority"               
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:background="#000000"
            />
    </LinearLayout>

As i wrote previous version of this post, the code above runs successfully in the first the the fragment loaded, imageview background color updated in preferences ui. I try to write failure condition step by step :

1 . I select the 3rd bar from actionbar and a fragment loaded including buttons.
2 . I press the button that loads preferences fragment(you can see the code above)
3 . In this preferencefragment, there is a preference including textview and imageview(you can see the details above)
4 . When i click this preference, a color picker ran.(you can see the details above)
5 . I choose a color from color picker and save it to sharedpreference.(you can see the details above)
6 . onsharedpreferencechanged event triggered and i change the background color of imageview(you can see the details above) succesfully.
7 . I leave fragment with choosing another tab from action bar or with using backpress button.
8 . I launch same fragment with pressing same button in 3rd bar.
9 . I again use color picker and onsharedpreferencechanged event is triggered.
10 . I can see with debugging that true color code is taken from sharedpreference and it is set to imageview background color and the code below is run :
getActivity().getSupportFragmentManager().beginTransaction().detach(this).commit() ; getActivity().getSupportFragmentManager().executePendingTransactions(); getActivity().getSupportFragmentManager().beginTransaction().attach(this).commit(); getActivity().getSupportFragmentManager().executePendingTransactions();

11 . But preference is not updated in this time. The old color or black is seen in imageview.

Thank you very much

2条回答
【Aperson】
2楼-- · 2019-09-08 23:44
getSupportFragmentmanager().detach(this).attach(this).commit()

All the changes cumming only after the commit. So if you will call detach(this) and attach(this) without a commit at the middle you changed nothing.

Try doing some thing like this:

getSupportFragmentmanager().detach(this).commit();
getSupportFragmentmanager().attach(this).commit();

This is what stays behind the commit idea.

P.S

I did not found FragmentManager.detach() method in the API...

查看更多
来,给爷笑一个
3楼-- · 2019-09-08 23:53

at last i solved the problem and it is really simple . I hope this post helps anyone who has problem with dynamic preference updating.

public class SettingsIncomingSearchFragment extends PreferenceListFragment  
implements  SharedPreferences.OnSharedPreferenceChangeListener,
PreferenceListFragment.OnPreferenceAttachedListener {

Context ctx ;
public static final String SHARED_PREFS_NAME = "settings";  
<-- Begin : i delete these global variables and define them in methods locally and
set the values in methods -->
LinearLayout mainlayout ;
LinearLayout sublayout ;
View view ;
Preference myPref ;
ImageView img ;
SharedPreferences sp ;
<-- End : i delete these global variables and define them in methods locally and 
set the values in methods -->    
查看更多
登录 后发表回答