2011-10-20 19 views
9

मैं एंड्रॉइड के माध्यम से वरीयता के लिए उचित लेआउट सेट कर सकता हूं: लेआउट विशेषता। एक उदाहरणएंड्रॉइड का उपयोग कर कस्टम वरीयता के लिए लेआउट को तुरंत कैसे करें: लेआउट विशेषता

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

जहां लेआउट

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

है मैं 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); 

लेकिन इन घटनाओं श्रोताओं में OnCreate में देखा गया हो सकता है, कि मैं निर्धारित किया है के लिए, निकाल दिया नहीं कर रहे हैं। मैं इन घटनाओं को कैसे पकड़ सकता हूं, उदाहरण के लिए - बटन से क्लिक करें। संपादित करें। नहीं, यह किसी भी अपवाद को आग नहीं लगा। यहाँ और अधिक विस्तृत कोड

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

कोई अपवाद या त्रुटियों निकाल दिया? मेरे लिए ऐसा लगता है कि यह काम करना चाहिए। BtnFric.setOnClickListener (नया OnClickListener() {@Override ...}) आज़माएं; – Vinay

+0

नहीं, इसने किसी अपवाद को नहीं रोका। – hardsky

+0

मुझे वरीयता से विरासत मिली, जैसा कि यहां दिया गया [लिंक] (http://stackoverflow.com/questions/5050272/android-seekbarpreference) – hardsky

उत्तर

2

मुझे यकीन है कि आप जिस तरह से है कि आप इसके बाद के संस्करण का वर्णन में एक PreferenceActivity साथ संयोजन के रूप में एक कस्टम लेआउट का उपयोग करने में सक्षम हैं नहीं कर रहा हूँ है।

मेरा मानना ​​है कि आप या तो चाहिए:

addPreferencesFromResource() के माध्यम से एक PreferenceScreen का प्रयोग करें और CheckBoxPreference, DialogPreference, और SharedPreferences मदों के लिए MultiSelectListPreference तरह वर्गों को लागू। (example)

या

कस्टम लेआउट (setContentView() का प्रयोग करके) के साथ एक कस्टम Activity (नहीं PreferenceActivity) बनाएँ, और उन्हें मैन्युअल रूप से घटना श्रोताओं (View.onClickListener(), आदि) का उपयोग कर SharedPreferences.Editor में संपादन SharedPreferences का उपयोग कर PreferenceManager.getDefaultSharedPreferences() में हुक।

आशा है कि यह समझ में आता है।

+0

हां, मैंने पहले प्रस्ताव के समान किया था। – hardsky

0

वास्तव में मुझे एक और समाधान मिला। आप अभी भी वरीयता का उपयोग कर सकते हैं:

बस एक टुकड़ा जोड़ें जो कस्टम लेआउट को कॉल करता है और इसकी कक्षा को जोड़ता है। हालांकि आप प्रकट में एक चेतावनी मिल जाएगा:

[रेस] (AndroidManifest.xml) (जो आप उपेक्षा कर सकते हैं या ठीक)

   android:name=".SettingsActivity_CUSTOMLAYOUT1" 

"YOURPACKAGE.SettingsActivity_CUSTOMLAYOUT1 सार्वजनिक नहीं है"

यह केवल आपके SettingsActivity से कहा जाता है, तो आप इसे

या

अनदेखा कर सकते हैं यदि आप इस गतिविधि fr कॉल करना चाहते हैं इसके बाहर ओम सिर्फ इसके लिए अपनी कक्षा बनाएं और इसे नाम दें सेटिंगActivity_CUSTOMLAYOUT1.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); 
     } 
    } 
} 

[एक्सएमएल] (pref_headers।एक्सएमएल)

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

[लेआउट] (CUSTOMLAYOUT1.xml)

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

न प्रकट में जोड़ने के लिए भूल जाते हैं।

[रेस] (AndroidManifest.xml)

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

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


    </application> 

</manifest> 
संबंधित मुद्दे