android: bottomsheet doesn't disappear normally

对着背影说爱祢 提交于 2019-12-10 23:59:31

问题


Edit:

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);
        }
    }
}

When click the floating action button "+", the bottomsheet show up like this:

Here is the activity_task.xml file:

<?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>

Everything seems OK, but when I click above the bottomsheet, it doesn't disappear totally as I expect:

What's wrong?


回答1:


"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.

Try to use like this.

<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>

Modify your code as this.

 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");
    }
});

EDIT 1:

Bottom sheets behavior is not hideable by default. You need to add this.

bottomSheetBehavior.setHideable(true);



回答2:


You are using a Persistent bottom sheet, this type of bottom sheet responds mainly to drag events i.e. you have to close it by dragging it down. If you want a bottom sheet that responds to clicking outside the dialog, consider Modal bottom sheet. Alternatively, you can also use the fab to toggle the state of the bottom sheet i.e onClick of the fab it should expand the sheet if collapsed or collapse it if expanded.



来源:https://stackoverflow.com/questions/37087352/android-bottomsheet-doesnt-disappear-normally

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!