webentwicklung-frage-antwort-db.com.de

AppCompatPreferenceActivity seltsame Auffüllung links und rechts in Android 4.4

Ich habe eine SettingsActivity, die AppCompatPreferenceActivity erweitert.

meine pref_headers.xml sieht folgendermaßen aus:

<preference-headers xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <header
        Android:fragment="com.blabla.activities.fragments.ProfileFragment"
        Android:icon="@drawable/ic_users"
        Android:title="Profil">
    </header>
</preference-headers>

Wo der Fragmentcode so aussieht:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ProfileFragment extends PreferenceFragment {
    @BindView(R.id.email)
    TextView email;
    @BindView(R.id.username)
    TextView username;
    @BindView(R.id.loadingPanel)
    RelativeLayout loadingPanel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_profile, container, false);
        ButterKnife.bind(this, rootView);

        if (setActionbarListener != null) {
            setActionbarListener.setActionbarTitle("Profil");
        }

        loadingPanel.setVisibility(View.VISIBLE);
        UsernameHandler uHandler = UsernameHandler.getInstance(new UsernameResult() {
            @Override
            public void finished(String uname) {
                username.setText(uname);
                loadingPanel.setVisibility(View.GONE);  // hide loading spinner
            }
        });
        email.setText(MainActivity.getFbUser().getEmail());

        return rootView;
    }
}

Mein Problem ist, dass links und rechts etwas Platz für das Layout ist, das ich lade. Diese Polsterung kommt definitiv nicht vom Layout selbst. Beim Starten der App in Android 8.1 gibt es keine solche Auffüllung/Marge.

Siehe das Bild:

 enter image description here

Zum Schluss der Code der SettingsActivity:

public class SettingsActivity extends AppCompatPreferenceActivity implements OnSetActionbarTitleListener {

    /**
     * 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
     */
    public 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);
        setupActionBar();
    }


    /**
     * Set up the {@link Android.app.ActionBar}, if the API is available.
     */
    private void setupActionBar() {
        getLayoutInflater().inflate(R.layout.pref_toolbar, (ViewGroup)findViewById(Android.R.id.content));
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        if (toolbar != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }

        setActionBarBelowContent();
    }

    private void setActionBarBelowContent() {
        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 actionBarHeight = UserInterfaceUtils.getActionBarHeight(MainActivity.context);
        getListView().setPadding(0, actionBarHeight+10, 0, verticalMargin);
    }

    @Override
    public void onHeaderClick(Header header, int position) {
        setActionBarBelowContent();
        super.onHeaderClick(header, position);
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        int id = item.getItemId();
        if (id == Android.R.id.home) {
            onBackPressed();
            return true;
        }
        return super.onMenuItemSelected(featureId, item);
    }

    /**
     * {@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.
     */
    @Override
    protected boolean isValidFragment(String fragmentName) {
        return PreferenceFragment.class.getName().equals(fragmentName)
                || SettingsFragment.class.getName().equals(fragmentName)
                || FeedbackFragment.class.getName().equals(fragmentName)
                || ProfileFragment.class.getName().equals(fragmentName)
                || AGBFragment.class.getName().equals(fragmentName)
                || PrivacyFragment.class.getName().equals(fragmentName)
                || FAQFragment.class.getName().equals(fragmentName)
                || LicenseFragment.class.getName().equals(fragmentName);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        setActionbarTitle("Einstellungen");
    }

    @Override
    public void setActionbarTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

Bearbeiten - hinzugefügtes Layout

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/item_list_item"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.CardView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:cardUseCompatPadding="true"
        app:cardElevation="4dp"
        app:cardCornerRadius="0dp">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_marginTop="10dp"
            Android:padding="15dp"
            Android:orientation="vertical">

            <LinearLayout
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:orientation="horizontal">

                <TextView
                    Android:id="@+id/preUsername"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:text="Dein Benutzername:"
                    Android:textAppearance="@style/profileText"
                    Android:textStyle="bold"/>

                <TextView
                    Android:id="@+id/username"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:textAppearance="@style/profileText"
                    Android:layout_marginLeft="5dp"/>

            </LinearLayout>

            <LinearLayout
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:orientation="horizontal">

                <TextView
                    Android:id="@+id/preEmail"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:textAppearance="@style/profileText"
                    Android:textStyle="bold"
                    Android:text="Deine Email:"/>

                <TextView
                    Android:id="@+id/email"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:textAppearance="@style/profileText"
                    Android:layout_marginLeft="5dp"/>

            </LinearLayout>

        </LinearLayout>
    </Android.support.v7.widget.CardView>

    <RelativeLayout
        Android:id="@+id/loadingPanel"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:gravity="center">

        <ProgressBar
            Android:id="@+id/progressBar"
            style="@style/MyProgressBarSpinner"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:indeterminate="true" />
    </RelativeLayout>

</RelativeLayout>
12
progNewbie

Dies ist der Entwurf, d. H. Das erwartete Verhalten, das Sie bei KitKat-Geräten auffüllen. Aus Offizielle Dokumentation :

Auf Plattformen vor Lollipop schneidet CardView die Grenzen der - Karte für die abgerundeten Ecken nicht ab. Stattdessen wird der Inhalt so mit Aufgefüllt, dass er nicht mit den abgerundeten Ecken überlappt. Sie können dieses Verhalten Deaktivieren, indem Sie dieses Feld auf false setzen.

Lösung:

Im XML-Layout: app:cardPreventCornerOverlap="false"

OR

In Java: setPreventCornerOverlap(false);

Also in deinem Fall:

<Android.support.v7.widget.CardView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:cardUseCompatPadding="true"
    app:cardElevation="4dp"
    app:cardPreventCornerOverlap="false"
    app:cardCornerRadius="0dp">

Hoffe es wird dir helfen!

3
VicJordan

Du hast recht, dass diese Auffüllung nicht wegen CardView ist:

 enter image description here

Es passiert auf Pre-Lolipop wegen prefs Auffüllungen:

 enter image description here

 enter image description here

Um diesen Rand in Ihrem Fall zu entfernen, können Sie nach dem Erstellen der Ansicht Auffüllungen aus der übergeordneten Ansicht entfernen

 @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        View containerParent = (View)view.getParent();
        containerParent.setPadding(0, 0, 0, 0);
    }

Dadurch werden Auffüllungen auf dem Pre-Lolipop entfernt

 enter image description here

2
dilix

Haben Sie versucht, PreferenceFragmentCompat zu verwenden, wenn Sie Ihre ProfileFragment so erweitern: public class ProfileFragment extends PreferenceFragmentCompat? Sieht aus wie PreferenceFragmentveraltet ist.

0
PRA

Wenn Sie app:cardUseCompatPadding=true verwenden. Verwenden Sie negatives layout_margin, um die unerwünschte Auffüllung aus der kompatiblen Bibliothek auszugleichen. Beispiel unten:

<Android.support.v7.widget.CardView

   Android:layout_width="match_parent"
   Android:layout_margin="-10dp"
   Android:layout_height="wrap_content"
   app:cardUseCompatPadding="true"
   app:cardElevation="4dp"
   app:cardCornerRadius="0dp">

// Your other views

</Android.support.v7.widget.CardView>

Dies entfernt unerwünschten Speicherplatz und sieht für alle Betriebssysteme ähnlich aus (Nicht in Orio getestet)

Für detailliertere Informationen zu cardview Android CardView document. und auch diese Stackoverflow-Antwort überprüfen Android-Layout unerwünschte Auffüllung

0
Upendra Shah

Ich glaube, ich erinnere mich, dass ich solche Probleme mit Preferences hatte. Ich glaube ich habe benutzt:

if(view != null) {
    ListView lv = (ListView) view.findViewById(Android.R.id.list);
    lv.setPadding(0, 0, 0, 0);
}

in onCreateView().

0
shkschneider