.
110-Android Studio 1.5 Settings Activity Template
| 
Continue from Tutorial 109 | 
1) Create New Project
1.1) Configure New Project
Application Name: MySettings1
Company Domain: notarazi.com
Package Name: com.notarazi.mysettings1 (auto-generated)
Project Location: C:\Project1\MySettings1\ (auto-generated)
1.2) Select Target Device
1.3) Add Activity
Select Settings Activity.
1.4) Customize The Activity
Accept defaults.
2) Observe the project codes
2.1) AndroidManifest.xml
| 
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
   package="com.notarazi.mysettings1"> 
   <application 
       android:allowBackup="true" 
       android:icon="@mipmap/ic_launcher" 
       android:label="@string/app_name" 
       android:supportsRtl="true" 
       android:theme="@style/AppTheme"> 
       <activity 
           android:name=".SettingsActivity" 
           android:label="@string/app_name"> 
           <intent-filter> 
               <action android:name="android.intent.action.MAIN" /> 
               <category android:name="android.intent.category.LAUNCHER" /> 
           </intent-filter> 
       </activity> 
   </application> 
</manifest> | 
2.2) SettingsActivity.java
| 
package com.notarazi.mysettings1; 
import android.annotation.TargetApi; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.media.Ringtone; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.preference.ListPreference; 
import android.preference.Preference; 
import android.preference.PreferenceActivity; 
import android.support.v7.app.ActionBar; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 
import android.preference.RingtonePreference; 
import android.text.TextUtils; 
import android.view.MenuItem; 
import java.util.List; 
/** 
* A {@link PreferenceActivity} that presents a set of application settings. On 
* handset devices, settings are presented as a single list. On tablets, 
* settings are split by category, with category headers shown to the left of 
* the list of settings. 
* <p/> 
* See <a href="http://developer.android.com/design/patterns/settings.html"> 
* Android Design: Settings</a> for design guidelines and the <a 
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings 
* API Guide</a> for more information on developing a Settings UI. 
*/ 
public class SettingsActivity extends AppCompatPreferenceActivity { 
   /** 
    * A preference value change listener that updates the preference's summary 
    * to reflect its new value. 
    */ 
   private static Preference.OnPreferenceChangeListenersBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
       @Override 
       public boolean onPreferenceChange(Preference preference, Object value) { 
           String stringValue = value.toString(); 
           if (preference instanceof ListPreference) { 
               // For list preferences, look up the correct display value in 
               // the preference's 'entries' list. 
               ListPreference listPreference = (ListPreference) preference; 
               int index = listPreference.findIndexOfValue(stringValue); 
               // Set the summary to reflect the new value. 
               preference.setSummary( 
                       index >= 0 
                               ? listPreference.getEntries()[index] 
                               : null); 
           } else if (preference instanceof RingtonePreference) { 
               // For ringtone preferences, look up the correct display value 
               // using RingtoneManager. 
               if (TextUtils.isEmpty(stringValue)) { 
                   // Empty values correspond to 'silent' (no ringtone). 
                   preference.setSummary(R.string.pref_ringtone_silent); 
               } else { 
                   Ringtone ringtone = RingtoneManager.getRingtone( 
                           preference.getContext(), Uri.parse(stringValue)); 
                   if (ringtone == null) { 
                       // Clear the summary if there was a lookup error. 
                       preference.setSummary(null); 
                   } else { 
                       // Set the summary to reflect the new ringtone display 
                       // name. 
                       String name = ringtone.getTitle(preference.getContext()); 
                       preference.setSummary(name); 
                   } 
               } 
           } else { 
               // For all other preferences, set the summary to the value's 
               // simple string representation. 
               preference.setSummary(stringValue); 
           } 
           return true; 
       } 
   }; 
   /** 
    * Helper method to determine if the device has an extra-large screen. For 
    * example, 10" tablets are extra-large. 
    */ 
   private static boolean isXLargeTablet(Context context) { 
       return (context.getResources().getConfiguration().screenLayout 
               & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
   } 
   /** 
    * Binds a preference's summary to its value. More specifically, when the 
    * preference's value is changed, its summary (line of text below the 
    * preference title) is updated to reflect the value. The summary is also 
    * immediately updated upon calling this method. The exact display format is 
    * dependent on the type of preference. 
    * 
    * @see #sBindPreferenceSummaryToValueListener 
    */ 
   private static void bindPreferenceSummaryToValue(Preference preference) { 
       // Set the listener to watch for value changes. 
       preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 
       // Trigger the listener immediately with the preference's 
       // current value. 
       sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
               PreferenceManager 
                       .getDefaultSharedPreferences(preference.getContext()) 
                       .getString(preference.getKey(), "")); 
   } 
   @Override 
   protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setupActionBar(); 
   } 
   /** 
    * Set up the {@link android.app.ActionBar}, if the API is available. 
    */ 
   private void setupActionBar() { 
       ActionBar actionBar = getSupportActionBar(); 
       if (actionBar != null) { 
           // Show the Up button in the action bar. 
           actionBar.setDisplayHomeAsUpEnabled(true); 
       } 
   } 
   /** 
    * {@inheritDoc} 
    */ 
   @Override 
   public boolean onIsMultiPane() { 
       return isXLargeTablet(this); 
   } 
   /** 
    * {@inheritDoc} 
    */ 
   @Override 
   @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
   public void onBuildHeaders(List<Header> target) { 
       loadHeadersFromResource(R.xml.pref_headers, target); 
   } 
   /** 
    * This method stops fragment injection in malicious applications. 
    * Make sure to deny any unknown fragments here. 
    */ 
   protected boolean isValidFragment(String fragmentName) { 
       return PreferenceFragment.class.getName().equals(fragmentName) 
               || GeneralPreferenceFragment.class.getName().equals(fragmentName) 
               || DataSyncPreferenceFragment.class.getName().equals(fragmentName) 
               || NotificationPreferenceFragment.class.getName().equals(fragmentName); 
   } 
   /** 
    * This fragment shows general preferences only. It is used when the 
    * activity is showing a two-pane settings UI. 
    */ 
   @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
   public static class GeneralPreferenceFragment extends PreferenceFragment { 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           addPreferencesFromResource(R.xml.pref_general); 
           setHasOptionsMenu(true); 
           // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
           // to their values. When their values change, their summaries are 
           // updated to reflect the new value, per the Android Design 
           // guidelines. 
           bindPreferenceSummaryToValue(findPreference("example_text")); 
           bindPreferenceSummaryToValue(findPreference("example_list")); 
       } 
       @Override 
       public boolean onOptionsItemSelected(MenuItem item) { 
           int id = item.getItemId(); 
           if (id == android.R.id.home) { 
               startActivity(new Intent(getActivity(), SettingsActivity.class)); 
               return true; 
           } 
           return super.onOptionsItemSelected(item); 
       } 
   } 
   /** 
    * This fragment shows notification preferences only. It is used when the 
    * activity is showing a two-pane settings UI. 
    */ 
   @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
   public static class NotificationPreferenceFragment extends PreferenceFragment { 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           addPreferencesFromResource(R.xml.pref_notification); 
           setHasOptionsMenu(true); 
           // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
           // to their values. When their values change, their summaries are 
           // updated to reflect the new value, per the Android Design 
           // guidelines. 
           bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); 
       } 
       @Override 
       public boolean onOptionsItemSelected(MenuItem item) { 
           int id = item.getItemId(); 
           if (id == android.R.id.home) { 
               startActivity(new Intent(getActivity(), SettingsActivity.class)); 
               return true; 
           } 
           return super.onOptionsItemSelected(item); 
       } 
   } 
   /** 
    * This fragment shows data and sync preferences only. It is used when the 
    * activity is showing a two-pane settings UI. 
    */ 
   @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
   public static class DataSyncPreferenceFragment extends PreferenceFragment { 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           addPreferencesFromResource(R.xml.pref_data_sync); 
           setHasOptionsMenu(true); 
           // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
           // to their values. When their values change, their summaries are 
           // updated to reflect the new value, per the Android Design 
           // guidelines. 
           bindPreferenceSummaryToValue(findPreference("sync_frequency")); 
       } 
       @Override 
       public boolean onOptionsItemSelected(MenuItem item) { 
           int id = item.getItemId(); 
           if (id == android.R.id.home) { 
               startActivity(new Intent(getActivity(), SettingsActivity.class)); 
               return true; 
           } 
           return super.onOptionsItemSelected(item); 
       } 
   } 
} | 
AppCompatPreferenceActivity.java
| 
package com.notarazi.mysettings1; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.preference.PreferenceActivity; 
import android.support.annotation.LayoutRes; 
import android.support.annotation.Nullable; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatDelegate; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuInflater; 
import android.view.View; 
import android.view.ViewGroup; 
/** 
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls 
* to be used with AppCompat. 
*/ 
public abstract class AppCompatPreferenceActivity extends PreferenceActivity { 
   private AppCompatDelegate mDelegate; 
   @Override 
   protected void onCreate(Bundle savedInstanceState) { 
       getDelegate().installViewFactory(); 
       getDelegate().onCreate(savedInstanceState); 
       super.onCreate(savedInstanceState); 
   } 
   @Override 
   protected void onPostCreate(Bundle savedInstanceState) { 
       super.onPostCreate(savedInstanceState); 
       getDelegate().onPostCreate(savedInstanceState); 
   } 
   public ActionBar getSupportActionBar() { 
       return getDelegate().getSupportActionBar(); 
   } 
   public void setSupportActionBar(@Nullable Toolbar toolbar) { 
       getDelegate().setSupportActionBar(toolbar); 
   } 
   @Override 
   public MenuInflater getMenuInflater() { 
       return getDelegate().getMenuInflater(); 
   } 
   @Override 
   public void setContentView(@LayoutRes int layoutResID) { 
       getDelegate().setContentView(layoutResID); 
   } 
   @Override 
   public void setContentView(View view) { 
       getDelegate().setContentView(view); 
   } 
   @Override 
   public void setContentView(View view, ViewGroup.LayoutParams params) { 
       getDelegate().setContentView(view, params); 
   } 
   @Override 
   public void addContentView(View view, ViewGroup.LayoutParams params) { 
       getDelegate().addContentView(view, params); 
   } 
   @Override 
   protected void onPostResume() { 
       super.onPostResume(); 
       getDelegate().onPostResume(); 
   } 
   @Override 
   protected void onTitleChanged(CharSequence title, int color) { 
       super.onTitleChanged(title, color); 
       getDelegate().setTitle(title); 
   } 
   @Override 
   public void onConfigurationChanged(Configuration newConfig) { 
       super.onConfigurationChanged(newConfig); 
       getDelegate().onConfigurationChanged(newConfig); 
   } 
   @Override 
   protected void onStop() { 
       super.onStop(); 
       getDelegate().onStop(); 
   } 
   @Override 
   protected void onDestroy() { 
       super.onDestroy(); 
       getDelegate().onDestroy(); 
   } 
   public void invalidateOptionsMenu() { 
       getDelegate().invalidateOptionsMenu(); 
   } 
   private AppCompatDelegate getDelegate() { 
       if (mDelegate == null) { 
           mDelegate = AppCompatDelegate.create(this, null); 
       } 
       return mDelegate; 
   } 
} | 
DOWNLOAD
.

 
No comments:
Post a Comment