2017-06-30 2 views
0

Spinnerを使用するのではなく、Androidで選択メニューを作成しようとしていますが、レイアウトに問題があります。 ListPopUpWindowを使用して、下の画像のようなものを作成するにはどうすればよいですか?ListPopUpWindowはAndroidのマテリアルによって設計されています

おかげ

enter image description here

+1

使用PopupWindow - それはガイドラインの下でサンプルアプリで見つけることができます。あなたのケースでは、ListViewまたはRecyclerView。 showAtLocationまたはshowAsDropDownは、popupWindowの位置を固定するために使用されます。ここにはクールな例がありますhttp://www.devexchanges.info/2015/02/android-popupwindow-show-as-dropdown.html – uguboz

+0

ありがとう、それは私を助けました。私は実装しようとします。 –

答えて

0

私は実際に選択した項目の上に浮いこれらのメニューのようなので、私はあなたのケースを実装して自分のドロップダウンクラスを作成しました。 @ugubozが書いたことはほとんどありません。

私は、RecyclerViewを持つカスタムレイアウトでPopupWindowを使用しています。次に、onClickを処理してそのウィンドウを表示し、PopupWindow.update()をオーバーライドして正しいウィンドウ位置を計算します。

最も興味深い部分は、このコードを次のようになります。

public class DropDownMenu extends PopupWindow { 

    public boolean show(View anchor) { 
     mAnchorView = anchor; 

     super.showAtLocation(anchor, Gravity.START | Gravity.TOP, 0, 0); 

     update(); 

     return true; 
    } 

    public void update() { 
     final Resources res = getContentView().getContext().getResources(); 

     int margin = (int) res.getDimension(R.dimen.carbon_margin); 
     int itemHeight = (int) res.getDimension(R.dimen.carbon_listItemHeight); 
     int marginHalf = (int) res.getDimension(R.dimen.carbon_paddingHalf); 

     ArrayAdapter adapter = getAdapter(); 

     Rect windowRect = new Rect(); 
     mAnchorView.getWindowVisibleDisplayFrame(windowRect); 
     int hWindow = windowRect.bottom - windowRect.top; 
     int wWindow = windowRect.right - windowRect.left; 

     int[] location = new int[2]; 
     mAnchorView.getLocationInWindow(location); 

     if (mode == DropDown.Mode.Over) { 
      int maxHeightAbove = location[1] - windowRect.top - marginHalf * 2; 
      int maxItemsAbove = maxHeightAbove/itemHeight; 
      int maxHeightBelow = hWindow - location[1] - marginHalf * 2; 
      int maxItemsBelow = maxHeightBelow/itemHeight; 

      int itemsBelow = Math.min(adapter.getItemCount() - selectedItem, maxItemsBelow); 
      int itemsAbove = Math.min(selectedItem, maxItemsAbove); 

      int popupX = location[0] - margin - marginHalf; 
      int popupY = location[1] - marginHalf * 2 - itemsAbove * itemHeight - (itemHeight - (mAnchorView.getHeight() - mAnchorView.getPaddingTop() - 
        mAnchorView.getPaddingBottom()))/2 + mAnchorView.getPaddingTop(); 
      int popupWidth = mAnchorView.getWidth() + margin * 2 + marginHalf * 2 - mAnchorView.getPaddingLeft() - mAnchorView.getPaddingRight(); 
      int popupHeight = marginHalf * 4 + Math.max(1, itemsAbove + itemsBelow) * itemHeight; 

      popupWidth = Math.min(popupWidth, wWindow - marginHalf * 2); 
      popupX = Math.max(popupX, 0); 
      popupX = Math.min(popupX, wWindow - popupWidth); 

      LinearLayoutManager manager = (LinearLayoutManager) recycler.getLayoutManager(); 
      manager.scrollToPositionWithOffset(selectedItem - itemsAbove, 0); 

      update(popupX, popupY, popupWidth, popupHeight); 
     } else { 
      // not interesting 
     } 

     super.update(); 
    } 
} 

コードは、すべての詳細をここに貼り付けることがあまりにも長いですので、私はあなたのクラスへのリンクを提供します:DropDownMenuを。それをあなたが望むように使用してください。私はコードが役に立つと思います。

私はガイドラインからそのイメージのサンプルを作成しました。 >メニュー/行動お好みのカスタムレイアウトと

enter image description here enter image description here

+0

うわー、それはたくさんのコードです、私はそれが非常に便利だろうと思っています:D。ありがとうございました –

+0

プロジェクトをインポートして使用する方法を教えるチュートリアルはありますか?私はSampleActivityを実行するためのいくつかの問題に直面しています。例えば、org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler型のオブジェクトの実装を見つけることができません。Android SDK ManagerからAndroid Support Repositoryをインストールしてください。 Open Android SDK Manager。このリポジトリはすでにインストールされています。 –

+0

いいえ。プロジェクトはMaven依存関係(ライブラリ)またはapk(サンプルアプリケーション)として使用されるはずです。あなたのケースはちょっと違って、私はあなたのために準備ができていません。あなたの問題はAndroid Studioのバージョンに関連している可能性があります。最新のコードは、3.0 m1のグラデルを持つAS 3.0 canary 5を使用して開発されました。ご質問やご不明な点がございましたら、Carbonのコミュニティ(https://plus.google.com/u/0/communities/111973718340428039040)にお問い合わせください。コードに関する問題が発生した場合は、問題を提起してください(https://github.com/ZieIony/Carbon/issues) – Zielony

関連する問題