2011-10-20 15 views
9

posso impostare il layout appropriato per preferenza attraverso Android: l'attributo di layout. Per un esempiocome creare un'istanza di layout per la preferenza personalizzato, utilizzando Android: il layout attribuiscono

<Preference android:key="friction" android:title="@string/friction" android:layout="@layout/friction_fragment" android:shouldDisableView="true" android:defaultValue="30" android:enabled="true" android:selectable="true" android:summary="Bite friction"></Preference> 

in cui layout è

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:text="@string/friction" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"></TextView> 
    <SeekBar android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/sbFriction"></SeekBar> 
    <TextView android:text="@string/friction_little" android:id="@+id/txtSummary" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
    <Button android:text="Button" android:id="@+id/btnFriction" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 

</LinearLayout> 

posso ottenere viste in OnCreate in PreferenceActivity

Preference fric = (Preference)this.findPreference("friction"); 
    View v = fric.getView(null, null); 
    SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction); 
    sbFriction.setOnSeekBarChangeListener(this); 
    Button btnFric = (Button) v.findViewById(R.id.btnFriction); 
    btnFric.setOnClickListener(m_onClick); 

ma questi eventi ascoltatori, che ho impostato, non sono licenziato. Come posso catturare questi eventi, ad esempio, fare clic sul pulsante. Modifica. No, non ha generato alcuna eccezione. Qui è il codice più dettagliata

public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnSeekBarChangeListener 
{ 

    private TextView m_txtSummary; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     ListPreference difficulty = (ListPreference)this.findPreference("difficulty"); 
     difficulty.setSummary(difficulty.getEntry()); 
     difficulty.setOnPreferenceChangeListener(this); 

     Preference fric = (Preference)this.findPreference("friction"); 
     View v = fric.getView(null, null); 
     SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction); 
     sbFriction.setOnSeekBarChangeListener(this); 
     Button btnFric = (Button) v.findViewById(R.id.btnFriction); 
     btnFric.setOnClickListener(m_onClick); 

     m_txtSummary = (TextView)v.findViewById(R.id.txtSummary); 

     fric.setSummary(fric.toString()); 
     fric.setOnPreferenceChangeListener(this); 

     CheckBoxPreference music = (CheckBoxPreference)this.findPreference("music"); 
     music.setOnPreferenceChangeListener(this); 
    } 

    private OnClickListener m_onClick = new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      v.getId(); 
     } 

    }; 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     if(newValue instanceof Boolean) 
      return true; 

     preference.setSummary(newValue.toString()); 
     return true; 
    } 

    @Override 
    public void onProgressChanged(SeekBar v, int nProgress, boolean arg2) { 
     // TODO Auto-generated method stub 
     m_txtSummary.append(" " + nProgress); 
     m_txtSummary.invalidate(); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 
     //notifyChanged(); 
    } 
} 
+0

eventuali eccezioni o errori sparato? A me sembra che dovrebbe funzionare. Prova btnFric.setOnClickListener (new OnClickListener() {@Override ...}); – Vinay

+0

No, non ha generato alcuna eccezione. – hardsky

+0

ho ereditato da Preferenze, come risposta qui [link] (http://stackoverflow.com/questions/5050272/android-seekbarpreference) – hardsky

risposta

2

Non sono sicuro che siete in grado di utilizzare un layout personalizzato in congiunzione con un PreferenceActivity nel modo in cui si descrivono sopra.

credo che si dovrebbe neanche:

Utilizzare un PreferenceScreen via addPreferencesFromResource() e implementare le classi come CheckBoxPreference, DialogPreference, e MultiSelectListPreference per le SharedPreferences voci. (example)

o

Creare un personalizzata Activity (non PreferenceActivity) con layout personalizzato (utilizzando setContentView()) e agganciare manualmente nella SharedPreferences utilizzando PreferenceManager.getDefaultSharedPreferences() modificarle negli ascoltatori di eventi (View.onClickListener(), ecc) utilizzando SharedPreferences.Editor.

Spero che abbia senso.

+0

Sì, l'ho fatto simile alla prima offerta. – hardsky

0

In realtà ho trovato un un'altra soluzione. Si potrebbe ancora utilizzare il Preferenceability:

Basta aggiungere un frammento che chiama il layout personalizzato e aggiungerlo classe. Tuttavia si otterrà un avviso nel Manifesto: (che si può ignorare o correzione)

[res] (AndroidManifest.xml)

   android:name=".SettingsActivity_CUSTOMLAYOUT1" 

"YOURPACKAGE.SettingsActivity_CUSTOMLAYOUT1 non è pubblico"

si chiama solo dal vostro SettingsActivity in modo da poter ignorare

o

se si desidera chiamare questo FR Occupazione al di fuori solo creare una propria classe per esso e denominarlo SettingsActivity_CUSTOMLAYOUT1.java.

CODICE:

[java] (SettingsActivity.java)

public class SettingsActivity extends AppCompatPreferenceActivity { 

    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object value) { 
      String stringValue = value.toString(); 

      if (preference instanceof ListPreference) { 
       ListPreference listPreference = (ListPreference) preference; 
       int index = listPreference.findIndexOfValue(stringValue); 
       preference.setSummary(
         index >= 0 
           ? listPreference.getEntries()[index] 
           : null); 

      } else if (preference instanceof RingtonePreference) { 
       if (TextUtils.isEmpty(stringValue)) { 
        preference.setSummary(R.string.pref_ringtone_silent); 

       } else { 
        Ringtone ringtone = RingtoneManager.getRingtone(
          preference.getContext(), Uri.parse(stringValue)); 

        if (ringtone == null) {       
         preference.setSummary(null); 
        } else { 
         String name = ringtone.getTitle(preference.getContext()); 
         preference.setSummary(name); 
        } 
       } 

      } else { 
       preference.setSummary(stringValue); 
      } 
      return true; 
     } 
    }; 

    private static boolean isXLargeTablet(Context context) { 
     return (context.getResources().getConfiguration().screenLayout 
       & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
    } 

    private static void bindPreferenceSummaryToValue(Preference preference) { 
     preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 
     sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
       PreferenceManager 
         .getDefaultSharedPreferences(preference.getContext()) 
         .getString(preference.getKey(), "")); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setupActionBar(); 
    } 


    private void setupActionBar() { 
     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayHomeAsUpEnabled(true); 
     } 
    } 

    @Override 
    public boolean onIsMultiPane() { 
     return isXLargeTablet(this); 
    } 

    @Override 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.pref_headers, target); 
    } 

    protected boolean isValidFragment(String fragmentName) { 
     return PreferenceFragment.class.getName().equals(fragmentName) 
       || YOURFRAGMENT1.class.getName().equals(fragmentName) 
       || YOURFRAGMENT2.class.getName().equals(fragmentName) 
       || CUSTOMLAYOUT1.class.getName().equals(fragmentName) 
       //... Add Fragments 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class YOURFRAGMENT1 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.YOURFRAGMENTXML1); 
      setHasOptionsMenu(true);  
     } 

     @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); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class YOURFRAGMENT2 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_private_data); 
      setHasOptionsMenu(true);  
     } 

     @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); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class FRAGMENTFORCUSTOMLAYOUT1 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      startActivity(new Intent(getActivity(), SettingsActivity.class));  
      startActivity(new Intent(getActivity(), CUSTOMLAYOUT1.class)); 
      setHasOptionsMenu(true); 

     } 

     @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); 
     } 
    } 

} 

class SettingsActivity_CUSTOMLAYOUT1 extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.CUSTOMLAYOUT1); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

[xml] (pref_headers.xml)

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> 

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT1" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT2" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$CUSTOMLAYOUT1" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 


</preference-headers> 

[layout] (CUSTOMLAYOUT1.xml)

<?xml version="1.0" encoding="utf-8"?> 
<...your custom layout> 

Non dimenticate di aggiungere in manifesto.

[res] (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?> 
<manifest> 
    <application 

     //Add activity 
     <activity 
      android:name=".SettingsActivity_CUSTOMLAYOUT1" 
      android:parentActivityName=".SettingsActivity"> 
     </activity> 


    </application> 

</manifest> 
Problemi correlati