Material Design-一般的なコントロールの説明と使用

20545 ワード

効果図1.gif
効果2.gif
依存の追加
 implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.android.support:cardview-v7:27.1.1'
 implementation 'com.android.support:recyclerview-v7:27.1.1'
 implementation 'com.android.support:design:27.1.1'

activity_mainメインレイアウト



    

        

            
        

        

            
        

        
    

    



DrawerLayout+NavigationViewはサイドスライドmDrawerLayout.openDrawer(GravityCompat.START)を実現する.mDrawerLayout.openDrawer(Gravity.LEFT)の左側を開きます
AppBarLayout app:layout_scrollFlagsパラメータ:
  • scroll値がscrollに設定されているViewは、スクロールイベントとともに移動します.
  • enterAlways:値はenterAlwaysのViewに設定され、ScrollViewが下にスクロールすると、そのViewは直接下にスクロールします.ScrollViewがスクロールしているかどうかを考慮する必要はありません.
  • exitUntilCollapsed:値をexitUntilCollapsedのViewに設定します.このViewが徐々に「消滅」すると、残りの高さが最小の高さに達するまで上へスライドし、ScrollViewの内部スライドイベントに応答します.
  • enterAlwaysCollapsed:enterAlwaysの追加オプションです.一般的にenterAlwaysと一緒に使用されます.これは、Viewが下に「現れた」とき、まずenterAlways効果です.Viewの高さが最小の高さに達すると、Viewは一時的に下にスクロールせず、ScrollViewが上部までスライドしないまでスライドしたとき、Viewは下にスライドし続けます.ビューの上部まで滑って終わります.

  • NavigationView\
     android:layout_gravity="start"     ,end     
      app:headerLayout="@layout/nav_header"     
     app:menu="@menu/nav_menu"      
    

    nav_ヘッダーレイアウト
    
    
    
        
    
        
    
        
    
    
    

    nav_menuメニュー内容
    
    
        
            
            
            
            
            
        
    
    

    toolbarスタイル
    
    
        
        
        
    
    

    1.alaways:この値を使用すると、メニュー項目がActionBarに表示されます.2.ifRoom:十分なスペースがあれば、この値はActionBarにメニューを表示します.3.never:この値メニューはActionBarでは決して表示されません.4.withText:この値はメニューとそのアイコン、メニューテキストを一緒に表示します.
    MainActivityメインレイアウト
    public class MainActivity extends AppCompatActivity {
        private DrawerLayout mDrawerLayout;
        /**
         *      
         */
        private Fruit[] fruits = {new Fruit("Apple", R.drawable.apple), new Fruit("Banana", R.drawable.banana),
                new Fruit("Orange", R.drawable.orange), new Fruit("Watermelon", R.drawable.watermelon),
                new Fruit("Pear", R.drawable.pear), new Fruit("Grape", R.drawable.grape),
                new Fruit("Pineapple", R.drawable.pineapple), new Fruit("Strawberry", R.drawable.strawberry),
                new Fruit("Cherry", R.drawable.cherry), new Fruit("Mango", R.drawable.mango)};
        private List fruitList = new ArrayList<>();
        private SwipeRefreshLayout swipeRefresh;
        private FruitAdapter adapter;
    
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //  toolbar
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            //  
            NavigationView navView = findViewById(R.id.nav_view);
            mDrawerLayout = findViewById(R.id.drawer_layout);
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                //         ,id android.R.id.home
                actionBar.setDisplayHomeAsUpEnabled(true);
                //           
                actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
            }
            //      item
            navView.setCheckedItem(R.id.nav_call);
            //       
            View headerView = navView.getHeaderView(0);
            //     
            headerView.findViewById(R.id.icon_image).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "     ", Toast.LENGTH_SHORT).show();
                }
            });
            //     
            headerView.findViewById(R.id.mail).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "     ", Toast.LENGTH_SHORT).show();
                }
            });
            //      
            headerView.findViewById(R.id.username).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "      ", Toast.LENGTH_SHORT).show();
                }
            });
    
            //      
            navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
                    //    
                    mDrawerLayout.closeDrawers();
                    return true;
                }
            });
            //      
            FloatingActionButton fab = findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Snackbar   ,            View,     
                    Snackbar.make(v, "Data deleted", Snackbar.LENGTH_LONG).setAction("Undo", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(MainActivity.this, "Data restored", Toast.LENGTH_SHORT).show();
                        }
                    }).show();
                }
            });
            initFruits();
            RecyclerView recyclerView = findViewById(R.id.recycler_view);
            GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new FruitAdapter(fruitList);
            recyclerView.setAdapter(adapter);
            //       
            swipeRefresh = findViewById(R.id.swipe_refresh);
            //              
            swipeRefresh.setColorSchemeResources(R.color.colorAccent);
            //       
            swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    refreshFruits();
                }
            });
        }
    
        /**
         *     ,    
         */
        private void refreshFruits() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            initFruits();
                            adapter.notifyDataSetChanged();
                            swipeRefresh.setRefreshing(false);
                        }
                    });
                }
            }).start();
        }
    
        /**
         *      
         */
        private void initFruits() {
            fruitList.clear();
            for (int i = 0; i < 50; i++) {
                Random random = new Random();
                int index = random.nextInt(fruits.length);
                fruitList.add(fruits[index]);
            }
        }
    
        /**
         *      menu   
         *
         * @param menu
         * @return
         */
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.toolbar, menu);
            return true;
        }
    
        /**
         *   menu     
         *
         * @param item
         * @return
         */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    mDrawerLayout.openDrawer(GravityCompat.START);
                    break;
                case R.id.backup:
                    Toast.makeText(this, "You clicked Backup", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.delete:
                    Toast.makeText(this, "You clicked Delete", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.settings:
                    Toast.makeText(this, "You clicked Settings", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    FruitAdapterアダプタ
    public class FruitAdapter extends RecyclerView.Adapter {
        private static final String TAG = "FruitAdapter";
    
        private Context mContext;
    
        private List mFruitList;
    
        public FruitAdapter(List fruitList) {
            this.mFruitList = fruitList;
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            CardView cardView;
            ImageView fruitImage;
            TextView fruitName;
    
            public ViewHolder(View itemView) {
                super(itemView);
                cardView = (CardView) itemView;
                fruitImage = itemView.findViewById(R.id.fruit_image);
                fruitName = itemView.findViewById(R.id.fruit_name);
            }
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //     
            if (mContext == null) {
                mContext = parent.getContext();
            }
            View view = LayoutInflater.from(mContext).inflate(R.layout.fruit_item, parent, false);
            final ViewHolder holder = new ViewHolder(view);
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //       
                    int position = holder.getAdapterPosition();
                    Fruit fruit = mFruitList.get(position);
                    Intent intent = new Intent(mContext, FruitActivity.class);
                    intent.putExtra(FruitActivity.FRUIT_NAME, fruit.getName());
                    intent.putExtra(FruitActivity.FRUIT_IMAGE_ID, fruit.getImageId());
                    mContext.startActivity(intent);
                }
            });
            return holder;
        }
    
        /**
         *     
         */
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Fruit fruit = mFruitList.get(position);
            //    
            Glide.with(mContext).load(fruit.getImageId()).into(holder.fruitImage);
            //    
            holder.fruitName.setText(fruit.getName());
        }
    
        @Override
        public int getItemCount() {
            return mFruitList.size();
        }
    }
    

    FruitActivity
    public class FruitActivity extends AppCompatActivity {
        public static final String FRUIT_NAME = "FRUIT_NAME";
        public static final String FRUIT_IMAGE_ID = "FRUIT_IMAGE_ID";
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fruit);
            //            Id
            Intent intent = getIntent();
            String fruitName = intent.getStringExtra(FRUIT_NAME);
            int fruitImageId = intent.getIntExtra(FRUIT_IMAGE_ID, 0);
            //toolbar
            Toolbar toolbar = findViewById(R.id.toolbar);
            //collapsingToolbar
            CollapsingToolbarLayout collapsingToolbar = findViewById(R.id.collapsing_toolbar);
            ImageView fruitImageView = findViewById(R.id.fruit_image_view);
            TextView fruitContentText = findViewById(R.id.fruit_content_text);
            //  actionbar
            setSupportActionBar(toolbar);
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                actionBar.setDisplayHomeAsUpEnabled(true);
            }
            //    
            collapsingToolbar.setTitle(fruitName);
            //    
            Glide.with(this).load(fruitImageId).into(fruitImageView);
            String fruitContent = generateFruitContent(fruitName);
            fruitContentText.setText(fruitContent);
        }
    
        private String generateFruitContent(String fruitName) {
            StringBuilder fruitContent = new StringBuilder();
            for (int i = 0; i < 500; i++) {
                fruitContent.append(fruitName);
            }
            return fruitContent.toString();
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    finish();
                    return true;
                default:
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    activity_fruitレイアウト
    
    
    
        
    
            
    
                
    
                
            
        
    
        
    
            
    
                
    
                    
                
            
        
    
        
    
    

    fitsSystemWindowsはsdk>=19のシステムにのみ作用する4.4より高いシステムであるこの属性は任意のviewに設定することができ、このviewを設定したすべてのpadding属性が失効する限り、透明状態バー(StatusBar)またはナビゲーションバー(NavigationBar)が設定されている場合にのみ有効である.
    CollapsingToolbarLayout CollapsingToolbarLayoutは、Toolbarを再包装するためのViewGroupで、主に折りたたみ(実は伸縮のように見える~)を実現するためのApp Bar効果です.AppBarLayoutレイアウトに配置し、AppBarLayoutの直接サブViewとして使用する必要があります.CollapsingToolbarLayoutには主にいくつかの機能が含まれています
  • コンテンツガーゼ:スクロール位置がバルブ値に達するかどうかによって、Viewに対して「ガーゼをかぶせる」かどうかを決定します.setContentScrim(Drawable)でガーゼの画像を設定できます.ここでapp:contentScrim=「?attr/colorPrimary」
  • app:layout_collapseMode="pin":サブView位置を固定する(Pinned position children):サブViewは、レイアウトが移動しているときに、移動の影響を受けずにtoolbar位置を固定できるため、グローバル空間上で位置を固定するかどうかを選択できます.
  • app:layout_collapseMode=「parallax」視差スクロールサブView(Parallax scrolling children):サブViewは、現在のレイアウトで「視差」でスクロールに従うかどうかを選択できます.(PS:実はこのViewのスクロール速度を他の通常のスクロールのView速度より少し遅くします)
  • app:layout_behavior="@string/appbar_scrolling_view_behavior"設定をステータスバーの下に置く
  • app:layout_anchor="@id/appBar"はtoolbarに付属