android:bottomsheet 不会正常消失

标签 android android-layout bottom-sheet

编辑:

package com.walkindeep.teammanagerpreview;

import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.dexafree.materialList.card.Card;
import com.dexafree.materialList.card.CardProvider;
import com.dexafree.materialList.card.OnActionClickListener;
import com.dexafree.materialList.card.action.TextViewAction;
import com.dexafree.materialList.listeners.OnDismissCallback;
import com.dexafree.materialList.view.MaterialListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MyTaskActivity extends NavigationActivity {
    private Context mContext = this;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /*全局导航栏*/
        LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View contentView = inflater.inflate(R.layout.activity_task, null, false);
        drawer.addView(contentView, 0);

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

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floatingActionButtionTask);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View bottomSheet = findViewById(R.id.bottom_sheet);
                BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

/*cardView*/
//        initCard();
        final User user = User.init("xxx", "xxx");
        updateTask(user);

        /*下滑刷新*/
        final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.SwipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                updateTask(user, swipeRefreshLayout);
            }
        });



    }

    /*更新任务数据*/
    private void updateTask(User user, SwipeRefreshLayout swipeRefreshLayout) {
        DataHandler dataHandler = new DataHandler();
        dataHandler.getData("issues.json?assigned_to_id=me" + "&status_id=1", this, user);
        swipeRefreshLayout.setRefreshing(false);
    }

    /*更新任务数据*/
    private void updateTask(User user) {
        DataHandler dataHandler = new DataHandler();
        dataHandler.getData("issues.json?assigned_to_id=me" + "&status_id=1", this, user);
    }

    private Card[] jsonToCards(JSONObject userIssuesJSONObjectTemp) {
        JSONArray userIssuesJSONArray = null;
        try {
            userIssuesJSONArray = userIssuesJSONObjectTemp.getJSONArray("issues");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<Card> cards = new ArrayList<>();

        /*用于存储所有issue的list*/
        List<Issue> issueList = Issue.getIssueList();
        issueList.clear();

        for (int i = 0; i < userIssuesJSONArray.length(); i++) {
            try {
                /*创建issue类*/
                Issue issue = new Issue(userIssuesJSONArray.getJSONObject(i).getString("subject"), userIssuesJSONArray.getJSONObject(i).getString("description"), userIssuesJSONArray.getJSONObject(i).getInt("id"));
                issueList.add(issue);

                Card card = new Card.Builder(this)
                        .withProvider(new CardProvider())
                        .setLayout(R.layout.material_basic_buttons_card)

                        .setTitle(issue.getSubject())
                        .setDescription(issue.getDescription())
                        .addAction(R.id.left_text_button, new TextViewAction(this)
                                .setText("按钮1")
                                .setTextResourceColor(R.color.black_button)
                                .setListener(new OnActionClickListener() {
                                    @Override
                                    public void onActionClicked(View view, Card card) {
                                        Toast.makeText(mContext, "You have pressed the left button", Toast.LENGTH_SHORT).show();
                                    }
                                }))
                        .addAction(R.id.right_text_button, new TextViewAction(this)
                                .setText("按钮2")
                                .setTextResourceColor(R.color.accent_material_dark)
                                .setListener(new OnActionClickListener() {
                                    @Override
                                    public void onActionClicked(View view, Card card) {
                                        Toast.makeText(mContext, "You have pressed the right button", Toast.LENGTH_SHORT).show();
                                    }
                                }))
                        .endConfig()
                        .build();
                card.setTag(issue);//设置卡片和issue关联
                cards.add(card);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
        return cards.toArray(new Card[cards.size()]);
    }


    public void setCardsToUI(Card[] cards) {
        final MaterialListView mListView = (MaterialListView) findViewById(R.id.material_listview);
        mListView.getAdapter().clearAll();
        for (int i = 0; i < cards.length; i++) {
            mListView.getAdapter().add(cards[i]);

            /*设置卡片可以滑动删除*/
            cards[i].setDismissible(true);
        }

        /*设置滑动删除操作*/
        mListView.setOnDismissCallback(new OnDismissCallback() {
            public void onDismiss(final Card card, final int position) {
                Snackbar.make(mListView, "已标记完成", Snackbar.LENGTH_LONG)
                        .setCallback(new Snackbar.Callback() {
                            @Override
                            public void onDismissed(Snackbar snackbar, int event) {
                                if (event == DISMISS_EVENT_ACTION) {//do nothing but recover card
                                    mListView.getAdapter().add(position, card);
                                } else {
                                    Issue issue = (Issue) card.getTag();
                                    issue.setStatusid(3);
                                    issue.pushStatusName(mContext);

                                    List<Issue> issueList = Issue.getIssueList();


                                }
                            }
                        })
                        .setAction("撤销", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                            }
                        })

                        .show();
            }
        });
    }

    class DataHandler extends AbstractDataQuery {
        @Override
        protected void work(JSONObject userIssuesJSONObject) {
            Card[] cards = jsonToCards(userIssuesJSONObject);
            setCardsToUI(cards);
        }
    }
}

当点击 float 操作按钮“+”时, Bottom Sheet 显示如下:enter image description here

这是activity_task.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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MyTaskActivity">

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


        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

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

        <include layout="@layout/content_task" />
    </LinearLayout>

<ScrollView
    android:layout_width="match_parent"
    android:id="@+id/bottom_sheet"
    android:layout_height="wrap_content"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">



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

            <Button
                android:id="@+id/buildProjectButton"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/buildProject" />

            <Button
                android:id="@+id/buildTaskButton"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/buildTask" />

        </LinearLayout>

</ScrollView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/floatingActionButtionTask"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_input_add" />
</android.support.design.widget.CoordinatorLayout>

一切看起来都不错,但是当我点击 Bottom Sheet 上方时,它并没有像我预期的那样完全消失:

enter image description here

出了什么问题?

最佳答案

"By attaching a BottomSheetBehavior to a child View of a CoordinatorLayout (i.e., adding app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”), you’ll automatically get the appropriate touch detection to transition between five state...".Try changing your Linear Layout to Frame Layout will do.

尝试这样使用。

<FrameLayout
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ff0000"
    app:behavior_hideable="true"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

       <Button
            android:id="@+id/buildProjectButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/buildProject" />

        <Button
            android:id="@+id/buildTaskButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/buildTask" />


</FrameLayout>

将您的代码修改为这样。

 View bottomSheet = findViewById(R.id.bottom_sheet);
 BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
 bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);


bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        // React to state change
        Log.e("onStateChanged", "onStateChanged:" + newState);
        if (newState == BottomSheetBehavior.STATE_EXPANDED) {
               // Hide your state here.
        } 
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        // React to dragging events
        Log.e("onSlide", "onSlide");
    }
});

编辑1:

默认情况下, Bottom Sheet 行为是不可隐藏的。您需要添加此内容。

bottomSheetBehavior.setHideable(true);

关于android:bottomsheet 不会正常消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37087352/

相关文章:

java - Android 多次滑动 View

android - 处理 jetpack compose 中 modalBottomsheet 内容中的单击事件

android - 如何将 BottomSheetBehavior 与 BottomSheetDialogFragment 集成

Android 2.3.x javax.net.ssl.SSLHandshakeException : java. security.cert.CertPathValidatorException:找不到证书路径的信任 anchor

android - 如何使用外部 gradle 文件将源文件添加到 gradle 项目

android - 如何删除只有文本的 actionbar menuItem 之前的分隔符?

android - 在 frameLayout 中放置一个按钮

布局 XML 中的 Android 包/类名称?

java - 带 FAB 的模态 Bottom Sheet

android - 是否可以分配一个热键来在 Android Studio 中的 Activity 和 XML 布局之间切换?