[JAVA] [Android] J'ai créé un écran de liste de matériaux avec ListView + Bottom Sheet

introduction

De nos jours, il y a une tendance à retenir et à chuchoter la conception des matériaux. Il est très important que l'apparence soit rafraîchissante, mais j'espère juste que la convivialité ne sera pas insatisfaisante sans se concentrer sur l'apparence.

Personnellement, je pense que iOS récent en est un exemple ...

En dehors de cela, je pense qu'il est nécessaire de savoir ce qu'est la conception matérielle, alors faisons-le tout de suite!

material.gif

Préparation

Cette fois, nous avons besoin de com.android.support: design. Lorsque vous utilisez SVG pour le bouton Fab, assurez-vous d'inclure également com.android.support: support-vector-drawable. De plus, si minSdkVersion est inférieur à ** 21 **, vous devez utiliser ** Support Library **, donc la méthode de description changera légèrement. Faites attention.

build.gradle


android {
  compileSdkVersion 26
  buildToolsVersion "26.0.1"
  defaultConfig {
    ...
    minSdkVersion 19
    targetSdkVersion 26
    vectorDrawables.useSupportLibrary = true  //Mise en garde:Cette description est requise selon la version minSdkVersion lors de l'utilisation de l'icône SVG.(Cette fois, il est 19, donc c'est nécessaire)
  }
  buildTypes {
    ...
  }
}

dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  compile 'com.android.support:appcompat-v7:26.1.0'
  compile 'com.android.support:support-v4:26.1.0'
  compile 'com.android.support:design:26.1.0'
  compile 'com.android.support:support-vector-drawable:26.1.0'
}
スクリーンショット 2017-09-23 22.09.48.png

Si vous souhaitez utiliser l'icône SVG cette fois, cliquez avec le bouton droit de la souris sur [app] -> [res] -> [drawable], sélectionnez [New] -> [Vector Asset] et dites "add" *** Si vous sélectionnez l'icône de marque **, un fichier nommé *** ic_add_black_24dp.xml *** sera créé. Je voulais une icône blanche, alors j'ai ajouté ʻandroid: fillColor = "@ color / white" `au fichier xml créé et l'ai enregistré sous *** ic_add_white_24dp.xml ***. L'exemple de code fait référence à ce fichier, modifiez-le en conséquence en fonction de votre environnement.

ic_add_white_24dp.xm


<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24.0"
        android:viewportWidth="24.0">

  <path
      android:fillColor="@color/white"
      android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>

Implémentons-le facilement

Cette fois, j'ai créé une simple liste d'amis / écran d'édition en utilisant "Vue en liste" + "Feuille du bas". Voici l'exemple de code.

MainActivity.java


public class MainActivity extends AppCompatActivity {
  private BottomSheetBehavior behavior;
  private ArrayList<String> friend;
  private ArrayAdapter<String> friend_adapter;
  private int position;  //Rappelez-vous sur quelle ligne de ListView a été cliqué

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

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

    // bottom sheet
    View bottomSheet = findViewById(R.id.bottom_sheet);
    behavior = BottomSheetBehavior.from(bottomSheet);
    behavior.setState(BottomSheetBehavior.STATE_HIDDEN);

    // friend data
    friend = new ArrayList<>();
    for (int i = 0; i < 30; i++) {
      friend.add("ami" + i);
    }

    friend_adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, friend);

    ListView friendList = findViewById(R.id.list_friend);
    friendList.setAdapter(friend_adapter);
    friendList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        //Lorsque vous cliquez sur la liste d'amis, la feuille inférieure s'ouvre. Fermer si déjà ouvert.
        if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
          behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
        } else {
          behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
          position = i;
        }
      }
    });

    // fab button
    FloatingActionButton mFab = findViewById(R.id.fab_button);
    mFab.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        // editText view
        final EditText input = new EditText(MainActivity.this);
        input.setInputType(InputType.TYPE_CLASS_TEXT);
        input.setMaxLines(1);

        // create dialog
        new AlertDialog.Builder(MainActivity.this)
                .setTitle("s'inscrire")
                .setMessage("Veuillez entrer votre nom enregistré")
                .setView(input)
                .setPositiveButton("enregistrement", new DialogInterface.OnClickListener() { //Paramètres du bouton OK
                  public void onClick(DialogInterface dialog, int whichButton) {
                    friend.add(input.getText().toString());
                    friend_adapter.notifyDataSetChanged();
                    dialog.dismiss();
                  }
                })
                .setNegativeButton("Annuler", new DialogInterface.OnClickListener() { // Annulerボタンの設定
                  public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.dismiss();
                  }
                })
                .show();

        behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
      }
    });

    // menu list
    ArrayAdapter<String> menu_adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
    menu_adapter.add("Renommer");
    menu_adapter.add("Effacer");
    menu_adapter.add("Fermer");

    ListView menuList = findViewById(R.id.list_menu);
    menuList.setAdapter(menu_adapter);
    menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) {
        switch (i) {
          case 0:
            // editText view
            final EditText input = new EditText(MainActivity.this);
            input.setInputType(InputType.TYPE_CLASS_TEXT);
            input.setMaxLines(1);

            // create dialog
            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Renommer")
                    .setMessage(friend.get(position) + "Renommer")
                    .setView(input)
                    .setPositiveButton("Changement", new DialogInterface.OnClickListener() { //Paramètres du bouton OK
                      public void onClick(DialogInterface dialog, int whichButton) {
                        friend.set(position, input.getText().toString());
                        friend_adapter.notifyDataSetChanged();
                        dialog.dismiss();
                      }
                    })
                    .setNegativeButton("Annuler", new DialogInterface.OnClickListener() { // Annulerボタンの設定
                      public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                      }
                    })
                    .show();
            break;
          case 1:
            // create dialog
            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Effacer")
                    .setMessage(friend.get(position) + "Voulez-vous vraiment supprimer")
                    .setPositiveButton("Effacer", new DialogInterface.OnClickListener() { //Paramètres du bouton OK
                      public void onClick(DialogInterface dialog, int whichButton) {
                        friend.remove(position);
                        friend_adapter.notifyDataSetChanged();
                        dialog.dismiss();
                      }
                    })
                    .setNegativeButton("Annuler", new DialogInterface.OnClickListener() { // Annulerボタンの設定
                      public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                      }
                    })
                    .show();
            break;
        }
        behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
      }
    });
  }
}

activity_main.xml


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

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar"/>

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

  </LinearLayout>

  <LinearLayout
      android:id="@+id/bottom_sheet"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@android:color/white"
      android:orientation="vertical"
      app:behavior_hideable="true"
      app:behavior_peekHeight="200dp"
      app:layout_behavior="@string/bottom_sheet_behavior">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginTop="15dp"
        android:text="Menu"
        android:textSize="18sp"/>

    <ListView
        android:id="@+id/list_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/white"/>

  </LinearLayout>

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/fab_button"
      android:layout_width="56dp"
      android:layout_height="56dp"
      android:layout_margin="20dp"
      app:layout_anchor="@id/bottom_sheet"
      app:layout_anchorGravity="right|top"
      app:srcCompat="@drawable/ic_add_white_24dp"/>

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

Je pense que c'est une bonne idée de le copier et de le coller tel quel pour le faire fonctionner. Il n'y a pas de description aussi difficile, donc le raccourci est de tâtonner et d'approfondir votre compréhension tout en apportant des modifications.

Recommended Posts

[Android] J'ai créé un écran de liste de matériaux avec ListView + Bottom Sheet
Je veux faire une liste avec kotlin et java!
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de casser le bloc avec java (1)
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (version inachevée ②)
J'ai essayé de moderniser une application Java EE avec OpenShift.
Je veux créer une fonction avec kotlin et java!
J'ai créé un client RESAS-API en Java
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher
J'ai essayé d'interagir avec Java
Créer une carte de liste avec LazyMap
Comment créer un écran de démarrage
J'ai essayé de créer une application cartographique simple dans Android Studio
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
Faites une liste de choses à faire en famille avec Sinatra
J'ai essayé de démarrer avec Web Assembly
J'ai essayé de faire une sauvegarde automatique avec plus agréable + PostgreSQL + SSL + docker
J'ai essayé de créer une application d'apprentissage automatique avec Dash (+ Docker) part1 ~ Construction de l'environnement et vérification du fonctionnement ~
Faites une liste de choses à faire en famille avec Sinatra
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
J'ai créé une application Janken avec Android
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
[Java] J'ai essayé de me connecter en utilisant le pool de connexion avec Servlet (tomcat) & MySQL & Java
J'ai essayé de générer automatiquement une classe à convertir d'une classe de données en un bundle avec APT
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
[Android] Je veux faciliter le contrôle qualité ... C'est vrai! Faisons un menu de débogage!
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé de développer un outil de gestion des effectifs
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Créer un logiciel qui reflète l'écran Android sur un PC 1
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de développer un site Web pour enregistrer les dépenses.
J'ai essayé d'implémenter un serveur en utilisant Netty