web-dev-qa-db-fra.com

AppCompatPreferenceActivity étrange remplissage à gauche et à droite dans Android 4.4

J'ai un SettingsActivity prolongeant AppCompatPreferenceActivity.

mon pref_headers.xml ressemble à ceci:

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

Où le code de fragment ressemble à ceci:

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

Mon problème est qu’il ya un peu d’espace à gauche et à droite de la mise en page que je charge. Ce remplissage ne provient certainement pas de la mise en page elle-même. Lors du démarrage de l'application dans Android 8.1, il n'y a pas de telle marge/marge.

Regarder la photo:

 enter image description here

Enfin le code de la 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);
    }
}

Edit - ajout de mise en page

<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

C’est ce qui est prévu dans la conception, c'est-à-dire le comportement attendu du rembourrage sur les périphériques KitKat. De Documentation officielle :

Sur les plates-formes antérieures à Lollipop, CardView ne coupe pas les limites du fichier Carte pour les coins arrondis. Au lieu de cela, il ajoute un rembourrage au contenu afin que qu'il ne chevauchera pas les coins arrondis. Vous pouvez désactiver ceci comportement en définissant ce champ sur false.

Solution:

En présentation XML: app:cardPreventCornerOverlap="false"

OR

En Java: setPreventCornerOverlap(false);

Donc dans votre cas:

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

J'espère que cela vous aidera!

3
VicJordan

Vous avez raison de dire que ce remplissage n'est pas à cause de CardView:

 enter image description here

Cela se produit sur les pré-lolipops à cause des __pariages prefs:

 enter image description here

 enter image description here

Afin de supprimer cette bordure dans votre cas, vous pouvez simplement supprimer les rembourrages de la vue parente après la création de la vue.

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

Cela enlèvera les rembourrages sur les pré-lolipop

 enter image description here

2
dilix

Avez-vous essayé d'utiliser PreferenceFragmentCompat lors de l'extension de votre ProfileFragment comme: public class ProfileFragment extends PreferenceFragmentCompat? On dirait que PreferenceFragment est deprecated .

0
PRA

Si vous utilisez app:cardUseCompatPadding=true. Utilisez négatif layout_margin pour compenser le remplissage indésirable de la bibliothèque compat. Exemple ci-dessous:

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

Cela supprimera l’espace indésirable et ressemblera à tous les systèmes d’exploitation (non testé dans Orio)

Pour plus de détails sur cardview Android CardView document. et aussi vérifier cette réponse stackoverflow Rembourrage indésirable de la mise en page Android

0
Upendra Shah

Je pense me souvenir que j'avais de tels problèmes avec Preferences. Je pense avoir utilisé:

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

dans onCreateView().

0
shkschneider