2015-10-06 6 views
6

Ich entwickle eine Material Design App.Warum das Layout "settings.xml" überlappt die ActionBar/Toolbar?

Nach der Zugabe von settings.xml in SettingsActivity.java & die App läuft, wird die Aktivität wie folgt mit:

enter image description here

Hier SettingsActivity.java Code der Datei:

public class SettingsActivity extends AppCompatActivity { 

    Toolbar toolbar; 

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

     SpannableString s = new SpannableString("Settings"); 
     s.setSpan(new TypefaceSpan(this, "Roboto-Medium.ttf"), 0, s.length(), 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setTitle(s); 

     // Display the fragment as the main content. 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 

    } 

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

     public static final String SHARE_APP_PREFERENCE_KEY = "pref_key_share_app"; 

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

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.settings); 

     } 

     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
               String key) { 
      if (key.equals(SHARE_APP_PREFERENCE_KEY)) { 
       // do something 
      } 
     } 

    } 

} 

Hier activity_settings.xml Code der Datei :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       tools:context="com.abc.xxx.SettingsActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
     android:elevation="4dp"/> 

</RelativeLayout> 

Hier settings.xml Code der Datei:

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

    <PreferenceCategory android:title="@string/pref_notification" > 
     <CheckBoxPreference 
      android:defaultValue="true" 
      android:key="prefNotification" 
      android:summary="@string/pref_notify_summary" > 
     </CheckBoxPreference> 
    </PreferenceCategory> 

</PreferenceScreen> 

Ich weiß nicht, warum die settings.xml Layout der ActionBar/Symbolleiste überlappende ist!

Bitte lassen Sie es mich wissen.

Vielen Dank im Voraus.

Antwort

9

Ihre activity_settings.xml zu diesem

ändern
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        xmlns:app="http://schemas.android.com/apk/res-auto" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        tools:context="com.abc.xxx.SettingsActivity"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      android:elevation="4dp"/> 

    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_below="@id/toolbar" 
     android:layout_height="match_parent" /> 
    </RelativeLayout> 

und ändern Sie den Code zu diesem dass PreferenceActivity Entdeckt

// Display the fragment as the main content. 
    getFragmentManager().beginTransaction() 
      .replace(R.id.fragment_container, new SettingsFragment()) 
      .commit(); 
+0

Wie kann ich die Textfarbe des Präferenztitels ändern? –

+1

Sie können in diesem Link http://stackoverflow.com/questions/6297635/custom-preferencecategory-heading suchen – Sunny

+0

Warum muss ich '' unterhalb der Symbolleiste? – RoCk

1

in Lösung Sunnys oben abstürzen kann aufgrund sie einen Gehalt Ansicht ohne Listview lädt. Dies wird behoben, indem Sie es zu activity_settings.xml hinzufügen, aber PreferenceFragment ignoriert es einfach. Die activity_settings.xml wird das in etwa so aussehen

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<include layout="@layout/common_actionbar" /> 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

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

2

Wenn Sie das Fragment auf die Aktivität aufrufen, verwenden Sie nicht

// Display the fragment as the main content. 
    getFragmentManager().beginTransaction() 
      .replace(android.R.id.content, new SettingsFragment()) 
      .commit(); 

Statt

verwenden
// Display the fragment as the main content. 
    getFragmentManager().beginTransaction() 
      .replace(R.id.Your_Frame_ID_On_xml, new SettingsFragment()) 
      .commit(); 

Ich hatte das gleiche Problem für die Verwendung von android.R.id.content so ändern Sie es zu der ID, die Sie für den Rahmen zu hol verwenden d das Fragment auf dem Xml hat es behoben.