如何将标题添加到片段中,所以每当我点击标题时我都可以获得另一个片段?

时间:2017-01-23 09:50:38

标签: android android-fragments

这是我们使用SettingActivity

时提供给我们的最简单的代码
  package com.example.amit.ak505;


  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;
   import static com.example.amit.ak505.R.layout.button_xml;

   /**
    * 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.OnPreferenceChangeListener
    sBindPreferenceSummaryToValueListener = 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);
   // setContentView(R.layout.button_xml);
    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);
        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("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);
    }
 }
  }

general_pref.xml

 <PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">

<SwitchPreference
    android:defaultValue="true"
    android:key="example_switch"
    android:summary="@string/pref_description_social_recommendations"
    android:title="@string/pref_title_social_recommendations" />

      <!-- NOTE: EditTextPreference accepts EditText attributes. -->
      <!-- NOTE: EditTextPreference's summary should be set to its value by 
       the activity code. -->
    <EditTextPreference
    android:capitalize="words"
    android:defaultValue="@string/pref_default_display_name"
    android:inputType="textCapWords"
    android:key="example_text"
    android:maxLines="1"
    android:selectAllOnFocus="true"
    android:singleLine="true"
    android:title="@string/pref_title_display_name" />

   <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the
    dialog to
     dismiss it. -->

    <ListPreference
    android:defaultValue="-1"
    android:entries="@array/pref_example_list_titles"
    android:entryValues="@array/pref_example_list_values"
    android:key="example_list"
    android:negativeButtonText="@null"
    android:positiveButtonText="@null"
    android:title="@string/pref_title_add_friends_to_messages" />

   </PreferenceScreen>

我想要的只是在general_pref.xml.on中添加一个标题,点击我可以开始一个新的片段。

是否可以在general_pref.xml中使用标头?

1 个答案:

答案 0 :(得分:1)

使用您自己的布局(针对标题)将其添加到常规首选项的顶部(

<Preference
    android:key="launchFragment"
    android:title="Fragment Header"
    android:layout="@layout/my_custom_layout"/>

并将GeneralPreferenceFragment更新为 -

public static class GeneralPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {....
    Preference preference = findPreference("launchFragment");
        preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                // launch fragment
                return false;
            }
        });

它基本上是在顶部添加一个首选项并处理其click方法。希望这有帮助!