Custom layout for EditTextPreference with null validation in custom dialog - android

I have PreferenceActivity in my app and I want to specify custom layout for EditTextPreference.
I do it in an xml file with android:layout attribute. All is OK, the layout is getting changed but I can't change any value of its fields. The code is running without errors, in debug I can see that values are changed, but visually there are no changes.
I've tried to call view.invalidate() and onContentChanged() but nothing changed.
All of IDs are OK and no exceptions are being thrown. So I have no idea. I'll appreciate you help.
Here is code of my preferences_file_types.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:key="#string/preference_category_file_types"
android:title="#string/settings_supported_file_types" >
<EditTextPreference
android:key="#string/preference_file_type_image"
android:layout="#layout/file_types_list_item"
android:title="#string/settings_supported_file_types_hint" />
</PreferenceCategory>
</PreferenceScreen>
Here is code of my PreferenceActivity class:
public class FileTypesSettingsActivity extends PreferenceActivity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_file_types);
LayoutInflater inflater = getLayoutInflater();
EditTextPreference imageTypePreference = (EditTextPreference) findPreference(getString(R.string.preference_file_type_image));
View specifiedView = inflater.inflate(imageTypePreference.getLayoutResource(), null);
changeViewAttributes(specifiedView);
}
private void changeViewAttributes(View view) {
ImageView fileTypeIcon = (ImageView) view.findViewById(R.id.file_types_list_item_iv_icon);
fileTypeIcon.setBackgroundResource(R.drawable.ic_file_image);
TextView fileTypePredefined = (TextView) view.findViewById(R.id.file_types_list_item_tv_predefined_extensions);
fileTypePredefined.setText("JPG BMP GIF PNG");
TextView fileTypeAdded = (TextView) view.findViewById(R.id.file_types_list_item_tv_added_extensions);
fileTypeAdded.setText("BLA BLA BLA");
}
}

Related

Change all views text color in PreferenceActivity programmatically

I want to change text color of all view of PreferenceActivity when a SwitchPreference state changes.
prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:summary="Settings"
android:title="Settings" >
<SwitchPreference
android:key="NightMode"
android:summary="dark and light"
android:title="Night Mode" />
...
</PreferenceCategory>
</PreferenceScreen>
PrefsActivity.java
public class PrefsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
}
#Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
boolean nightMode = sharedPreferences.getBoolean("NightMode", false);
if(nightMode){
//I want to change text color here
}
}
}
I can change backgroundColor of layout this way:
getListView().setBackgroundColor(ContextCompat.getColor(this , R.color.colorBackground));
but how to change text color?
The way to change the text color is to call textviewinstance.setTextColor(color). You'd need to do that to every view independently though.
The best way to do this is to use the android theme system. If you set the theme before calling setContentView, all those views will be created with that theme. Make a theme with the text color you want for nightmode. When nightmode is selected, call recreate() to kill your activity and start a new one, just like what happens on configuration changes. Then in onCreate of the new instance, check if night mode is on and select your theme before setting the content view by calling setTheme(theme).

Checkboxpreference change value

I have checkboxpreference in preference activity and I want that when one of the checkbox is enabled then other checkbox should get to disable and vice versa.
I wants to do that from my main class activity.
Here is my code:
Preferencecheckbox.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:defaultValue="true"
android:icon="#drawable/img"
android:key="check1"
android:title="first" />
<CheckBoxPreference
android:defaultValue="false"
android:icon="#drawable/img2"
android:key="check2"
android:title="second" />
</PreferenceScreen>
Preferenceclass.java
public class preferenceclass extends PreferenceActivity {
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferencecheckbox);
}
You need to add a dependency to the checkbox you need disabled.
Like this:
<CheckBoxPreference
android:defaultValue="false"
android:icon="#drawable/img2"
android:key="check2"
android:title="second"
android:dependency="check1" />
Update
To disable other preferences via code.
final CheckBoxPreference checkbox2 = (CheakBoxPreference) findPreference("pref_checkbox2_key");
CheckBoxPreference switch = (CheakBoxPreference) findPreference("pref_switch_key");
switch.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
#Override
public boolean onPreferenceClick(Preference preference) {
if (switch.isChecked()) {
checkbox2.setEnabled(false);
} else {
checkbox2.setEnabled(true);
}
return true;
}
});
persistCheckBoxState(switch, checkbox2);
To persist the change when activity is closed, you need to get the preferences references like this and add directly below.
public void persistCheckBoxState (CheckBoxPreference switch, CheckBoxPreference checkbox2) {
if (switch.isChecked ()){
checkbox2.setEnabled(false);
} else {
checkbox2.setEnabled(true);
}
}
Maybe a ListPreference is more what you want. From a usability point of view this would make more sense. When you have to choose one selection out of many this would be the most obvious way to do it. See this post for further instructions

How to change imageview background color in a preference in android?

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
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...
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 -->

PreferenceEditText to string

So I have EditText in my Preferences and i want to get the text it and use it as String.Then i want to use that string everytime when my button is clicked and it will set my another EditText text to the string from Preference. Codes :
<EditTextPreference android:title="Uredi Text"
android:key="ime"
android:summary="ime pjesme"
/>
Java code :
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String b1t = preferences.getString("ime", "DEFAULT");
et1 = (EditText) findViewById(R.id.editText1);
//Button Click
public void button(View view) {
et1.setText(b1t);
}
According to the developer docs, you can just use edittextpreference.getText().toString()
http://developer.android.com/reference/android/preference/EditTextPreference.html
I'm not sure where your error is so I'll just give you my code for doing this.
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(getBaseContext();
String string = sharedPreferences
.getString("key", "default");
And in my preferences
<EditTextPreference
android:defaultValue="default"
android:key="key"
android:summary="I'm a summary"
android:title="I'm a title" />
For the onCLick method to modify the edit text
EditText editText = (EditText)
findViewById(R.id.editText);
editText.setText(String.valueOf(string));
This code works. If your application still crashes then your issue is either with your onClick event or something else. I personally prefer onClickListeners for buttons.
Heres the code for an onClickListener.
Button button = (Button)
findViewById(R.id.button);
button.setOnClickListener(new OnClickListener()
{
#Override
public void onClick(View v)
{
//Do some awesome stuff
}
});
edit: John posted his answer before mine, and his answer reflects most use cases, such as in a standard Activity. My answer is directed solely at the use of a PreferenceActivity.
Here's how you can add Preferences with defaults based on another Preference within a PreferenceActivity. Sorry if there are any errors, I'm typing on my phone.
Your XML-defined Preferences will have their values saved to SharedPreferences automatically, but code-created Preferences will need to be saved/persisted manually.
PreferenceActivity's onConfigurationChange() usually saves the state of code-created preferences (nested PreferenceScreens are a bit strange.)
And, of course, you'll want to do null checks (omitted to save my thumbs.)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="Preferences"
android:key="root">
<EditTextPreference android:title="Default Pref Text"
android:key="ime"
android:summary="ime pjesme"
/>
<Preference android:title="Click to add a preference."
android:key="add"
android:summary=""
/>
</PreferenceScreen>
MyActivity.class
public class MyActivity extends PreferenceActivity {
public void onCreate(Bundle inState) {
super.onCreate(inState);
setContentView(R.layout.activity_main);
getPreferenceScreen.findPreference(PREFERENCE_BUTTON).
setOnPreferenceClickListener(new OnNewPrefClickListener());
}
private class OnNewPrefClickListener implements OnPreferenceClickListener {
public boolean onPreferenceClick(Preference preference) {
PreferenceScreen rootScreen = getPreferenceScreen();
EditTextPreference defaultPref =
(EditTextPreference)rootScreen.findPreference("ime");
String defaultText = defaultPref.getText();
EditTextPreference newPref = new EditTextPreference(getApplicationContext());
newPref.setText(defaultText);
rootScreen.addPreference(newPref);
return true;
}
}
}

Could you give me a short Android code to create this?

http://habrastorage.org/storage/211878a0/14f474e6/bc73d2e8/a709e893.gif
how can I utilize the Toast object to ask a question?
I searched around but was not able to find how to make a Toast object ask a question
Thanks a lot Stack Overflow
here is a sample:
the solution is using an alert dialog with a layout that has a label and a text box.
public Dialog create()
{
LayoutInflater li = LayoutInflater.from(this._context);
this._view = li.inflate(R.layout.prompt_dialog, null);
AlertDialog ad = new AlertDialog.Builder(this._context).create();
ad.setView(this._view);
if(this._title != null)
{
ad.setTitle(this._title);
}
if(this._icon != 0)
{
ad.setIcon(this._icon);
}
TextView tv1 = (TextView)this._view.findViewById(R.id.prompt_dialog_message);
tv1.setText(this._message);
ad.setButton(DialogInterface.BUTTON_POSITIVE, _context.getString(R.string.ok), this);
ad.setButton(DialogInterface.BUTTON_NEUTRAL, _context.getString(R.string.cancel), this);
return ad;
}
I've used these in my Emergency Tools App And I didn't had any problems :)
Actually that's just a PreferenceActivity. Take a look at the JavaDoc for http://developer.android.com/reference/android/preference/PreferenceActivity.html
What you see is not a Toast notification.
It is a CustomDialog read more here
This is an EditTextPreference inside a PreferenceActivity
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mypref="http://schemas.android.com/apk/res/com.tneele.daynightlwp"
android:title="#string/settings_title"
android:key="daynightwallpaper_settings">
<EditTextPreference
android:dialogTitle="UserName" />
</PreferenceScreen>
PreferenceActivity:
public class MyPreferenceActivity extends PreferenceActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}

Categories

Resources