日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

android BottomSheetDialog新控件解析實現(xiàn)知乎評論列表效果(實例代碼)

瀏覽:162日期:2022-06-07 14:07:03

BottomSheetDialog使用解析

Android Support Library 23.2里的 Design Support Library新加了一個Bottom Sheets控件,Bottom Sheets顧名思義就是底部操作控件,用于在屏幕底部創(chuàng)建一個可滑動關(guān)閉的視圖,可以替代對話框和菜單。其中包含BottomSheets、BottomSheetDialog和BottomSheetDialogFragment三種可以使用。其中應(yīng)用較多的控件是BottomSheetDialog,主要運用在界面底部分享列表,評論列表等,最近在知乎評論列表界面看到知乎運用到了這個效果,所有在這里詳細介紹一下該控件的使用,以及簡單實現(xiàn)知乎評論列表功能。本文實現(xiàn)效果如下:

android BottomSheetDialog新控件解析實現(xiàn)知乎評論列表效果(實例代碼)

首先我們想要使用BottomSheets相關(guān)控件,需要先在build.gradle中添加design依賴,本文中使用的是:

compile ’com.android.support:design:25.3.0’

BottomSheetDialog可以替代大多數(shù)網(wǎng)格顯示和列表展示的dialog和popupwindow,默認寬度撐滿,并且在BottomSheetDialog 區(qū)域中向下滑動也讓對話框消失。

接下來創(chuàng)建BottomSheetDialog的布局文件dialog_bottomsheet.xml,布局文件如下:

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='wrap_content'> <RelativeLayout android: android:layout_width='match_parent' android:layout_height='45dp' android:background='@drawable/dialog_bottomsheet_shape'> <ImageView android: android:layout_width='45dp' android:layout_height='45dp' android:layout_centerVertical='true' android:layout_marginLeft='5dp' android:padding='5dp' android:src='http://m.b3g6.com/bcjs/@drawable/img_close' /> <TextView android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_centerVertical='true' android:layout_marginLeft='10dp' android:layout_toRightOf='@id/dialog_bottomsheet_iv_close' android:text='評論' android:textColor='#333' android:textSize='16sp' /> </RelativeLayout> <android.support.v7.widget.RecyclerView android: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_below='@id/dialog_bottomsheet_rl_title' android:background='#fff' /></RelativeLayout>

布局文件中,主要包含一個RecyclerView和一個頭布局。

然后,我們在Activity界面添加BottomSheetDailog初始化方法,

private void showSheetDialog() { View view = View.inflate(BottomSheetDialogActivity.this, R.layout.dialog_bottomsheet, null); iv_dialog_close = (ImageView) view.findViewById(R.id.dialog_bottomsheet_iv_close); rv_dialog_lists = (RecyclerView) view.findViewById(R.id.dialog_bottomsheet_rv_lists); iv_dialog_close.setOnClickListener(this); bottomSheetAdapter = new BottomSheetAdapter(BottomSheetDialogActivity.this, list_strs); rv_dialog_lists.setHasFixedSize(true); rv_dialog_lists.setLayoutManager(new LinearLayoutManager(BottomSheetDialogActivity.this)); rv_dialog_lists.setItemAnimator(new DefaultItemAnimator()); rv_dialog_lists.setAdapter(bottomSheetAdapter); bottomSheetDialog = new BottomSheetDialog(BottomSheetDialogActivity.this, R.style.dialog); bottomSheetDialog.setContentView(view); }

在改方法中,我們首先獲取BottomSheetDialog的布局文件,獲取該布局文件中相關(guān)控件,通過創(chuàng)建模擬列表數(shù)據(jù),為RecyclerView添加適配器

for (int i=0; i<20; i++) { list_strs.add('評論' + i); }

通過如下代碼,創(chuàng)建BottomSheetDialog對象

bottomSheetDialog = new BottomSheetDialog(BottomSheetDialogActivity.this, R.style.dialog);bottomSheetDialog.setContentView(view);

至此,我們即可以通過調(diào)用

bottomSheetDialog.show();

方法來查看BottomSheetDialog顯示效果

使用過程中出現(xiàn)的問題

當(dāng)我們向下滑動BottomSheetDialog隱藏Dialog后,無法用bottomSheetDialog.show()再次打開,為什么呢?我們先看下源碼的實現(xiàn):

@Overridepublic void setContentView(View view, ViewGroup.LayoutParams params) { super.setContentView(wrapInBottomSheet(0, view, params));}private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) { final CoordinatorLayout coordinator = View.inflate(getContext(),R.layout...., null); FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet); BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback); ... return coordinator;}private BottomSheetCallback mBottomSheetCallback = new BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { dismiss(); //關(guān)鍵代碼 } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { }};

通過源碼文件我們可以看出,系統(tǒng)的BottomSheetDialog是基于BottomSheetBehavior封裝的,當(dāng)我們滑動隱藏了BottomSheetBehavior中的View后,內(nèi)部是設(shè)置了BottomSheetBehavior的狀態(tài)為STATE_HIDDEN,接著它替我們關(guān)閉了Dialog,所以我們再次調(diào)用show()的時候Dialog沒法再此打開狀態(tài)為HIDE的Dialog了。 查看了源文件,我們就通過復(fù)寫B(tài)ottomSheetCallback的回調(diào)方法,來實現(xiàn)我們的效果,這里就引入了BottomSheetBehavior,下面先介紹BottomSheetBehavior的使用。

BottomSheetBehavior的作用

根據(jù)官方Api,BottomSheetBehavior有一個靜態(tài)方法BottomSheetBehavior.from(View),會返回這個View引用的BottomSheetBehavior,這個方法會檢查這個View是否是CoordinatorLayout的子View,如果是就會得到這個View的Behavior。通過BottomSheetBehavior,我們可以通過setPeekHeight(int height)設(shè)置dialog的顯示高度,通過setBottomSheetCallback(callback)實現(xiàn)BottomSheetDialog的狀態(tài)監(jiān)聽。其中,在BottomSheetCallback回調(diào)方法中,onStateChanged監(jiān)聽狀態(tài)的改變,onSlide是拖拽的回調(diào),onStateChanged可以監(jiān)聽到的回調(diào)一共有五種:

STATE_HIDDEN: 隱藏狀態(tài)。默認是false,可通過app:behavior_hideable屬性設(shè)置。 STATE_COLLAPSED: 折疊關(guān)閉狀態(tài)。可通過app:behavior_peekHeight來設(shè)置顯示的高度,peekHeight默認是0。 STATE_DRAGGING: 被拖拽狀態(tài) STATE_SETTLING: 拖拽松開之后到達終點位置(collapsed or expanded)前的狀態(tài)。 STATE_EXPANDED: 完全展開的狀態(tài)。

那么如何獲取到BottomSheetDialog的BottomSheetBehavior呢?

第一種:在BottomSheetDialog調(diào)用setContentView方法之后,調(diào)用

BottomSheetBehavior mDialogBehavior = BottomSheetBehavior.from((View) mContentView.getParent());

第二種:在BottomSheetDialog調(diào)用setContentView方法之后,調(diào)用

final FrameLayout frameLayout = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet);frameLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { frameLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); BottomSheetBehavior behavior = BottomSheetBehavior.from(frameLayout); //調(diào)用behavior相關(guān)方法 ... frameLayout.forceLayout();}

通過上面的介紹,修改上文中的showSheetDialog()用于解決上文中出現(xiàn)的問題,代碼如下:

private void showSheetDialog() { View view = View.inflate(BottomSheetDialogActivity.this, R.layout.dialog_bottomsheet, null); iv_dialog_close = (ImageView) view.findViewById(R.id.dialog_bottomsheet_iv_close); rv_dialog_lists = (RecyclerView) view.findViewById(R.id.dialog_bottomsheet_rv_lists); iv_dialog_close.setOnClickListener(this); bottomSheetAdapter = new BottomSheetAdapter(BottomSheetDialogActivity.this, list_strs); rv_dialog_lists.setHasFixedSize(true); rv_dialog_lists.setLayoutManager(new LinearLayoutManager(BottomSheetDialogActivity.this)); rv_dialog_lists.setItemAnimator(new DefaultItemAnimator()); rv_dialog_lists.setAdapter(bottomSheetAdapter); bottomSheetDialog = new BottomSheetDialog(BottomSheetDialogActivity.this, R.style.dialog); bottomSheetDialog.setContentView(view); mDialogBehavior = BottomSheetBehavior.from((View) view.getParent()); mDialogBehavior.setPeekHeight(getWindowHeight()); mDialogBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { bottomSheetDialog.dismiss(); mDialogBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { } }); }

在監(jiān)聽到用戶滑動關(guān)閉BottomSheetDialog后,我們把BottomSheetBehavior的狀態(tài)設(shè)置為BottomSheetBehavior.STATE_COLLAPSED,也就是半個打開狀態(tài)(BottomSheetBehavior.STATE_EXPANDED為全打開),至此就解決了調(diào)用show()方法無法正常打開的問題。同時我們通過設(shè)置setPeekHeight和BottomSheetDialog的透明主題來實現(xiàn)知乎評論列表的效果。 在values/styles.xml文件中添加透明主題

<style name='dialog' parent='@android:style/Theme.Dialog'> <item name='android:windowFrame'>@null</item> <item name='android:windowIsFloating'>true</item> <item name='android:windowIsTranslucent'>true</item> <item name='android:windowNoTitle'>true</item> <item name='android:background'>@android:color/transparent</item> <item name='android:windowBackground'>@android:color/transparent</item> <item name='android:backgroundDimEnabled'>true</item> <item name='android:backgroundDimAmount'>0.6</item> </style>

最后附上Activity界面完整代碼如下:

public class BottomSheetDialogActivity extends AppCompatActivity implements View.OnClickListener { private Button bt_start; private ImageView iv_dialog_close; private RecyclerView rv_dialog_lists; private BottomSheetAdapter bottomSheetAdapter; private BottomSheetDialog bottomSheetDialog; private BottomSheetBehavior mDialogBehavior; private List<String> list_strs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bottom_sheet_dialog); list_strs = new ArrayList<>(); initView(); showSheetDialog(); } private void initView() { bt_start = (Button) findViewById(R.id.main_bt_start); for (int i=0; i<20; i++) { list_strs.add('評論' + i); } bt_start.setOnClickListener(this); } private void showSheetDialog() { View view = View.inflate(BottomSheetDialogActivity.this, R.layout.dialog_bottomsheet, null); iv_dialog_close = (ImageView) view.findViewById(R.id.dialog_bottomsheet_iv_close); rv_dialog_lists = (RecyclerView) view.findViewById(R.id.dialog_bottomsheet_rv_lists); iv_dialog_close.setOnClickListener(this); bottomSheetAdapter = new BottomSheetAdapter(BottomSheetDialogActivity.this, list_strs); rv_dialog_lists.setHasFixedSize(true); rv_dialog_lists.setLayoutManager(new LinearLayoutManager(BottomSheetDialogActivity.this)); rv_dialog_lists.setItemAnimator(new DefaultItemAnimator()); rv_dialog_lists.setAdapter(bottomSheetAdapter); bottomSheetDialog = new BottomSheetDialog(BottomSheetDialogActivity.this, R.style.dialog); bottomSheetDialog.setContentView(view); mDialogBehavior = BottomSheetBehavior.from((View) view.getParent()); mDialogBehavior.setPeekHeight(getWindowHeight()); mDialogBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { bottomSheetDialog.dismiss(); mDialogBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { } }); } private int getWindowHeight() { Resources res = BottomSheetDialogActivity.this.getResources(); DisplayMetrics displayMetrics = res.getDisplayMetrics(); return displayMetrics.heightPixels; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_bt_start: if (bottomSheetDialog != null) { bottomSheetDialog.show(); } break; case R.id.dialog_bottomsheet_iv_close: if (bottomSheetDialog != null) { bottomSheetDialog.dismiss(); } break; } }}

到此這篇關(guān)于android BottomSheetDialog新控件解析實現(xiàn)知乎評論列表效果的文章就介紹到這了,更多相關(guān)android 知乎評論列表內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 知乎
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品国产91久久久久久| 日韩国产在线观看一区| 欧美a级一区二区| 国产精品嫩模av在线| 国产九九精品| 久久久久观看| 日韩伦理在线一区| 秋霞国产精品| 99在线|亚洲一区二区| 欧美午夜不卡| 中文字幕中文字幕精品| 好吊日精品视频| 日韩一二三区在线观看| 日韩高清不卡在线| 麻豆精品在线观看| 91视频精品| 美女网站一区| 亚洲理论在线| 精品国产亚洲一区二区三区| av在线最新| 国产一区亚洲| 视频一区日韩| 蜜桃精品视频| 99久久精品网站| 亚洲一区av| 久久久久97| 99国产精品一区二区| 国产亚洲亚洲| 国产伦精品一区二区三区在线播放| 日本欧美国产| 蜜臀精品一区二区三区在线观看| 日韩一区二区三区在线看| 精品一区二区三区的国产在线观看| 欧洲在线一区| 欧美一区网站| 1000部精品久久久久久久久| 日本亚洲三级在线| www在线观看黄色| 鲁大师成人一区二区三区| 国产欧美一区二区色老头| 成人羞羞视频在线看网址| 红桃视频国产一区| 国产欧美日本| 中文精品视频| 精品久久久久久久| 亚洲在线网站| 精品三区视频| 天堂精品久久久久| 99久久精品费精品国产| 国产麻豆一区| 亚洲欧美网站| 热三久草你在线| 日韩高清在线不卡| 日韩国产一区二区| 国产探花一区| 免费视频久久| 成人三级高清视频在线看| 亚洲a级精品| 蜜桃国内精品久久久久软件9| 视频精品一区| 99国产精品久久久久久久| 美女视频黄久久| 亚洲精品激情| 国产精品老牛| 婷婷激情一区| 精品视频久久| 国产精久久久| 91亚洲精品在看在线观看高清| 欧美精品羞羞答答| 夜鲁夜鲁夜鲁视频在线播放| 欧美国产不卡| 97久久超碰| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩国产亚洲一区| 韩国精品主播一区二区在线观看 | 欧美一区久久久| 国产调教一区二区三区| 日韩视频一区二区三区在线播放免费观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产精品99视频| 免费久久99精品国产| 中文字幕在线看片| 欧美精品三级在线| 99亚洲视频| 国产在线|日韩| 欧美一级网站| 91欧美日韩在线| 国产一级久久| 日韩免费小视频| 国产欧美日韩精品高清二区综合区 | 欧美亚洲三级| 日韩综合精品| 国产在线一区不卡| 欧美日韩亚洲一区| 热久久久久久久| 九色精品91| 日韩免费视频| 成人在线免费观看网站| 国产精品亚洲一区二区在线观看| 亚洲综合二区| 日韩一区自拍| 精品无人区麻豆乱码久久久| 青青国产精品| 热久久免费视频| 九九综合在线| 久久精品欧美一区| 亚洲精品在线影院| 国产成人精品福利| 久久国产乱子精品免费女| 日韩在线a电影| 日韩精品看片| 91久久视频| 久久美女精品| 亚洲国产福利| 日韩av自拍| 97精品97| 高清精品久久| 久久亚洲人体| 日韩影片在线观看| 青青草精品视频| 日本精品久久| 欧美天堂一区| 国产欧美高清| 国产精品一区免费在线| 欧美日韩一区二区国产| 日本精品一区二区三区在线观看视频| 免费看的黄色欧美网站| 国产精品日本欧美一区二区三区| 日韩中文字幕不卡| 亚洲bt欧美bt精品777| 亚洲免费一区三区| 日本少妇精品亚洲第一区| 日韩三级精品| 日韩精品免费视频一区二区三区| 亚洲ww精品| 国产精品第十页| 国产精品一区亚洲| 粉嫩av一区二区三区四区五区 | 亚洲毛片一区| 日韩中文字幕麻豆| 亚洲aa在线| 国产精品大片| 日韩在线观看| 成人看片网站| 日韩国产一区二| 久久精品国产网站| 亚洲综合电影| 91九色精品国产一区二区| 一本色道精品久久一区二区三区| 亚洲人妖在线| 麻豆成人在线观看| 亚洲国产综合在线看不卡| 欧美精品一区二区久久| 国产午夜一区| 精品国产网站| 欧美亚洲激情| 日韩一区二区三区免费视频| 欧美国产三级| 欧美日韩免费看片| 免费不卡在线观看| 老牛国内精品亚洲成av人片| 国产情侣一区在线| 欧美+亚洲+精品+三区| 免费日本视频一区| 国产精成人品2018| 九色精品91| 欧美久久亚洲| 久久国产精品成人免费观看的软件| 中文在线日韩| 欧美国产美女| 亚洲精选成人| 亚洲女同av| 亚洲精品极品| 日韩免费av| 亚洲aⅴ网站| 欧美天堂视频| 69堂免费精品视频在线播放| 欧美精品1区| 日韩午夜视频在线| 久久久精品久久久久久96| 日韩高清在线不卡| 亚洲a一区二区三区| 日韩精品三级| 亚洲高清成人| 国产精品视频一区二区三区综合| 国产伦一区二区三区| 亚洲伊人精品酒店| 日韩深夜视频| 国产日韩一区二区三区在线播放| 亚洲一本视频| 国产精品宾馆| 视频一区视频二区中文| 丰满少妇一区| 欧美在线首页| 日韩精品乱码av一区二区| 精品亚洲美女网站| 国产精品一区二区三区四区在线观看| 午夜日本精品| 天堂а√在线最新版中文在线| 日韩精品中文字幕吗一区二区|