2016-07-09 5 views
0

В настоящее время я пытаюсь разработать приложение для Android, которое должно иметь настройки. Насколько мне известно, я должен использовать параметр SettingsActivity.Основная деятельность Layout overlays SettingsActivity

Mine выглядит в настоящее время следующим образом:

package de.nocompany.myname.gw2companion; 

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.*; 
import android.support.v4.app.NavUtils; 
import android.support.v7.app.ActionBar; 
import android.support.v7.widget.Toolbar; 
import android.text.TextUtils; 
import android.util.TypedValue; 
import android.view.MenuItem; 
import android.view.ViewGroup; 

import java.util.List; 


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(); 
     int horizontalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); 
     int verticalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); 
     int topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (int) getResources().getDimension(R.dimen.activity_vertical_margin) + 30, getResources().getDisplayMetrics()); 
     getListView().setPadding(horizontalMargin, topMargin, horizontalMargin, verticalMargin); 
    } 

    private void setupActionBar() { 
     getLayoutInflater().inflate(R.layout.app_bar, (ViewGroup) findViewById(android.R.id.content)); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayHomeAsUpEnabled(true); 
     } 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     int id = item.getItemId(); 
     if (id == android.R.id.home) { 
      if (!super.onMenuItemSelected(featureId, item)) { 
       NavUtils.navigateUpFromSameTask(this); 
      } 
      return true; 
     } 
     return super.onMenuItemSelected(featureId, item); 
    } 

    @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) 
       || GeneralPreferenceFragment.class.getName().equals(fragmentName) 
       || DataSyncPreferenceFragment.class.getName().equals(fragmentName) 
       || NotificationPreferenceFragment.class.getName().equals(fragmentName); 
    } 

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

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

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

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

Проблема с этим кодом в том, что мои предпочтения практически не использовать, потому что мой макет MainActivity показано выше настроек. Я много искал для этого, но все же я не могу найти ответ, который удовлетворяет мои потребности. Многие ребята сказали, что вы можете использовать wrapArtivity с Layouts и Stuff, но, насколько мне известно, это не хорошее программирование, которое я пытаюсь сделать. И я знаю, что это довольно близко к примеру Google, но сейчас я начинаю разрабатывать приложение, чтобы оно было заменено! Thx заранее!

РЕДАКТИРОВАТЬ: Заменен код новой проблемой.

ответ

2

Да, это раздражает! Я столкнулся с той же проблемой. Шаблон, используемый на сайте Android Developer, датируется временем API 10. В моем примере ниже показано, как реализовать настройки с использованием современного шаблона проектирования Activity/Fragment.

pref_general.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ListPreference 
     android:icon="@drawable/ic_sort_black_48dp" 
     android:title="@string/pref_sort_label" 
     android:key="@string/pref_sort_key" 
     android:defaultValue="@string/pref_sort_favorite" 
     android:entryValues="@array/pref_sort_values" 
     android:entries="@array/pref_sort_options" /> 

</PreferenceScreen> 

arrays.xml

<resources> 

    <string-array name="pref_sort_options"> 
     <item>@string/pref_sort_label_popular</item> 
     <item>@string/pref_sort_label_rating</item> 
     <item>@string/pref_sort_label_favorite</item> 
    </string-array> 

    <string-array name="pref_sort_values"> 
     <item>@string/pref_sort_popular</item> 
     <item>@string/pref_sort_rating</item> 
     <item>@string/pref_sort_favorite</item> 
    </string-array> 

</resources> 

strings.xml

<string name="pref_sort_label">Sort Order</string> 
<string name="pref_sort_label_popular">Most Popular</string> 
<string name="pref_sort_label_rating">Top Rated</string> 
<string name="pref_sort_label_favorite">Favorites</string> 
<string name="pref_sort_key" translatable="false">sort</string> 
<string name="pref_sort_popular" translatable="false">popular</string> 
<string name="pref_sort_rating" translatable="false">rating</string> 
<string name="pref_sort_favorite" translatable="false">favorites</string> 

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".SettingsActivity" 
    tools:ignore="MergeRootFrame"> 

    <include 
     android:id="@+id/app_bar" 
     layout="@layout/app_bar" /> 

    <FrameLayout 
     android:id="@+id/container_settings" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

app_bar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    android:theme="@style/ToolbarTheme" 
    android:elevation="4dp" 
    app:titleMarginStart="32dp" 
    app:popupTheme="@style/PopupTheme"> 

</android.support.v7.widget.Toolbar> 

SettingsActivity.java

import android.os.Bundle; 
import android.preference.ListPreference; 
import android.preference.Preference; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

public class SettingsActivity extends AppCompatActivity { 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     getFragmentManager().beginTransaction() 
       .replace(R.id.container_settings, new SettingsFragment()) 
       .commit(); 
    } 

    public static class SettingsFragment extends PreferenceFragment 
      implements Preference.OnPreferenceChangeListener { 

     public static String TAG = SettingsFragment.class.getSimpleName(); 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      addPreferencesFromResource(R.xml.pref_general); 
      bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_sort_key))); 
     } 

     private void bindPreferenceSummaryToValue(Preference preference) { 
      preference.setOnPreferenceChangeListener(this); 

      onPreferenceChange(preference, 
        PreferenceManager 
          .getDefaultSharedPreferences(preference.getContext()) 
          .getString(preference.getKey(), "")); 
     } 

     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      String stringValue = newValue.toString(); 

      if (preference instanceof ListPreference) { 
       ListPreference listPreference = (ListPreference) preference; 
       int prefIndex = listPreference.findIndexOfValue(stringValue); 
       if (prefIndex >= 0) { 
        preference.setSummary(listPreference.getEntries()[prefIndex]); 
       } 
      } 
      else { 
       preference.setSummary(stringValue); 
      } 

      return true; 
     } 
    } 
} 
0

Я нашел мой отказ! Прочитав ответ apelosoczi, я узнал, что в моем приложении, я включил его с моей главной компоновкой. Теперь, после того как я объявил свой собственный app_bar для этого, он работает! Но теперь я должен добавить прописку над поднаборами :(который не работает в настоящее время ![Failure] 1

+0

Что вы имеете в виду? Можете ли вы опубликовать снимок экрана? Добавьте комментарий, когда вы это сделаете - я был бы рад помочь вам с Это связано с тем, что ваш контейнер перекрывает панель инструментов, поэтому я использую линейную компоновку. – apelsoczi

+0

@apelsoczi Отредактированный код –

+0

считал, что этот атрибут xml соответствует контейнеру, в котором находится ваш фрагмент: 'android: layout_marginTop ="? attr/actionBarSize «На телефонах это равно 56dp, другое значение на планшетах ... не помните, что бы это сделать. Используйте это в своих приложениях в будущем, всегда! Если это решает вашу проблему, пожалуйста, примите мой ответ, чтобы закрыть этот вопрос в stackoverflow – apelsoczi

Смежные вопросы