编辑:
BT/ET
这是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);
}
}
}
一切似乎都没问题,但当我点击底片上方时,它并没有像我预期的那样完全消失:
出了什么问题?
答案 0 :(得分:3)
“通过将BottomSheetBehavior附加到
CoordinatorLayout
的子视图(即添加app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”)
,您将自动获得适当的触摸检测以在五种状态之间转换......”。尝试更改您的Linear Layout
到Frame 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
如果展开则展开工作表,如果展开则展开工作表。