2016-05-07 3 views
2

Edit:андроид: bottomsheet не исчезает обычно

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

Когда нажмите кнопку плавающее действие "+", то bottomsheet показать, как это: 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> 

Все вроде нормально, но когда я нажимаю над bottomsheet, он не исчезает полностью, как я ожидал:

enter image description here

Что случилось?

+0

Используйте 'Frame Layout' вместо' Linear Layout' в вашем дочернем представлении. проверьте мой ответ. –

ответ

-1

Прежде всего, спасибо jaydroider, который мотивировал меня решить проблему.

Ключ в том, что нижний лист не спрятано по умолчанию. Так что вам нужно

bottomSheetBehavior.setHideable(true); 
+0

Цените мой ответ с братом наверху. благодаря :). –

2

«Присоединив BottomSheetBehavior дочернего Вида (т.е. добавление app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”), вы будете автоматически получать соответствующее обнаружение касания в CoordinatorLayout для перехода между пять государством ...». Попробуйте изменить ваш 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"); 
    } 
}); 

EDIT 1:

Bottom листов поведение не Hideable по умолчанию. Вам нужно добавить это.

bottomSheetBehavior.setHideable(true); 
+0

Это не сработало. Все та же проблема. – guo

+0

Он исчезает 'Bottom Sheet', как и ожидалось для моего дела. Мне нужно увидеть ваш код в этом случае. отправьте свой код 'Activity' в указанном выше вопросе. –

+0

@guo Я обновил свой ответ. попробуйте и сообщите мне, если у вас возникнут какие-либо проблемы. –

0

Вы используете Persistent нижний лист, этот тип нижнего листа реагирует главным образом на drag events то вы должны закрыть его, перемещая его вниз. Если вы хотите, чтобы нижний лист реагировал на нажатие вне диалогового окна, рассмотрите нижний лист Modal. В качестве альтернативы вы также можете использовать fab для переключения состояния нижнего листа i.e onClick из fab он должен развернуть лист, если он рухнул или свернуть, если он расширен.

+0

Как изменить мой нижний лист на Модальный нижний лист? – guo

Смежные вопросы