android:bottomsheet并没有正常消失

时间:2016-05-07 10:26:47

标签: android android-layout bottom-sheet

编辑:

BT/ET

单击浮动操作按钮" +"时,底部显示如下:enter image description here

这是activity_task.xml文件:

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

一切似乎都没问题,但当我点击底片上方时,它并没有像我预期的那样完全消失:

enter image description here

出了什么问题?

2 个答案:

答案 0 :(得分:3)

  

“通过将BottomSheetBehavior附加到CoordinatorLayout的子视图(即添加app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”),您将自动获得适当的触摸检测以在五种状态之间转换......”。尝试更改您的Linear LayoutFrame Layout会这样做。

尝试这样使用。

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

默认情况下,底部工作表行为无法隐藏。你需要添加它。

bottomSheetBehavior.setHideable(true);

答案 1 :(得分:0)

您正在使用Persistent底部工作表,这种类型的底部工作表主要响应drag events,即您必须通过向下拖动来关闭它。如果您想要一个响应在对话框外单击的底部工作表,请考虑Modal底部工作表。 或者,您也可以使用fab来切换底部工作表的状态,例如onClick fab如果展开则展开工作表,如果展开则展开工作表。