3
votes

Comment mettre en œuvre une nouvelle barre d'outils Gmail matérielle sans scrollview imbriquée?

Je souhaite implémenter une nouvelle barre d'outils gmail sans vue de défilement imbriquée, qui peut faire défiler, mais lorsque le défilement vers le bas, l'arrière-plan doit être visible.

Cela ressemblera à ceci: entrez la description de l'image ici


2 commentaires

Avez-vous trouvé une solution?


Avez-vous pu le mettre en œuvre? @koushik


3 Réponses :


2
votes

Il vous suffit d'en créer un personnalisé dans la mise en page de votre activité comme

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        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=".MainActivity">

    <android.support.design.widget.CoordinatorLayout
            android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <android.support.v7.widget.CardView
                android:layout_margin="16dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">


        <android.support.design.widget.AppBarLayout
                android:id="@+id/appbar"

                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

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

        </android.support.design.widget.AppBarLayout>
        </android.support.v7.widget.CardView>
    </android.support.design.widget.CoordinatorLayout>
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

Et de changer le style de votre activité en "NoActionBar". Pour moi, ça aide.


0 commentaires

3
votes

Ce n'est pas une vue par défilement imbriquée, c'est recyclerView . Si vous souhaitez une telle barre de recherche, vous pouvez la créer en utilisant CardView et Edittext ou utilisez la bibliothèque Material searchba . Vous pouvez le placer verrouillé à cette position en utilisant frameLayout ou CoordinatorLayout.

Voici un exemple d'écran que j'ai créé !.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:background="#dadada"
        android:layout_height="match_parent">

        <android.support.v7.widget.CardView
            app:cardUseCompatPadding="true"
            android:layout_margin="8dp"
            app:cardCornerRadius="8dp"
            android:layout_width="match_parent"
            android:layout_height="64dp">

            <android.support.constraint.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ImageView
                    android:id="@+id/imageView2"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_marginStart="8dp"
                    android:src="@drawable/ic_menu_black_24dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <EditText
                    android:id="@+id/editText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:layout_marginTop="8dp"
                    android:layout_marginBottom="8dp"
                    android:background="@android:color/transparent"
                    android:hint="Search..."
                    android:minWidth="100dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toEndOf="@+id/imageView2"
                    app:layout_constraintTop_toTopOf="parent" />

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_marginTop="8dp"
                    android:layout_marginEnd="8dp"
                    android:layout_marginBottom="8dp"
                    android:src="@drawable/ic_search_black_24dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

            </android.support.constraint.ConstraintLayout>

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

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

    </android.support.design.widget.CoordinatorLayout>

Voici le résultat.

 entrez la description de l'image ici


2 commentaires

Comment implémenter la recherche dans ce domaine?


Faites de votre fonction de recherche une nouvelle activité, créez un lien vers elle ... C'est ce qu'a fait Gmail. Avec de belles animations bien sûr.



0
votes

Pour tous ceux qui essaient d'implémenter cela avec un RecyclerView , utilisez simplement des types de vue d'élément avec des dispositions différentes. BaseAdapter contenant les données principales:

public class MyAdapter extends BaseHeaderAdapter
.....
@Override
    protected BaseAdapter.BaseViewHolder createViewHolder(View view) {
        return new MyAdapter.BaseViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final BaseAdapter.BaseViewHolder holder, int position) {
        if (holder.getItemViewType() == ITEM_HEADER) {
// do some stuff
            holder.mHeaderTitle.setText("Header");
        } else {
            super.onBindViewHolder(holder, position - 1);
        }
    }
// The ViewHolder extends the BaseHeaderAdapter.BaseHeaderViewHolder

Maintenant, créez un adaptateur abstrait qui étend l'adaptateur précédent:

public abstract class BaseHeaderAdapter extends BaseAdapter {

    protected static final int ITEM_HEADER = 0;
    protected static final int ITEM_LIST = 1;

   @NonNull
    @Override
    public BaseAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == ITEM_HEADER) {
// Notice the layout being inflated here
// This is a different layout
            View view = LayoutInflater.from(activity).inflate(R.layout.item_tab_header, parent, false);
            return createViewHolder(view);
        }
// This will return the default layout from the extended adapter
        return super.onCreateViewHolder(parent, viewType);
    }
// BaseAdapter and BaseViewHolder are extended
    @Override
    protected BaseAdapter.BaseViewHolder createViewHolder(View view) {
// Notice: BaseHeaderAdapter is the current adapter
// BaseViewHolder is the extended holder
        return new BaseHeaderAdapter.BaseViewHolder(view);
    }

 @Override
    public int getItemCount() {
        int superItemCount = super.getItemCount();
        return superItemCount == 0 ? 0 : superItemCount + 1;
    }

    @Override
    public int getItemViewType(int position) {
        return position == 0 ? ITEM_HEADER : ITEM_LIST;
    }
// This adapter's ViewHolder
public class BaseHeaderViewHolder extends BaseAdapter.BaseViewHolder {
...
}

}

Maintenant l'adaptateur qui affiche tout :

public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.BaseViewHolder> 

 @Override
    @NonNull
    public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// this is the main adapter so by default
// it should display the main content.
// Notice the layout being inflated here
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_song_list, null);
        return createViewHolder(v);

    }
// BaseViewHolder is the ViewHolder of this adapter
    protected BaseViewHolder createViewHolder(View view) {
        return new BaseViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final BaseViewHolder holder, final int position) {
        // Do something here
    }

Résultat final 2  Résultat final 1


0 commentaires