2

我正在开发一个应用程序,其中我有一个用ScrollView包装的布局。在这个布局的片段中,我打了一个Web服务来从服务器获取数据并将其显示在我的布局中。无论何时出现错误或Web服务中没有可用的数据,我都会向用户显示一个小吃棒,并在其中显示相应的消息。SnackBar导致ScrollView与非法状态异常崩溃

我有,只有出现非常较少的问题问题。当有时数据不可用,小吃吧显示,我的应用程序崩溃,并非法状态异常,显示消息

ScrollView can host only one direct child

这里是崩溃日志

java.lang.IllegalStateException: ScrollView can host only one direct child 
              at android.widget.ScrollView.addView(ScrollView.java:253) 
              at android.support.design.widget.Snackbar.showView(Snackbar.java:475) 
              at android.support.design.widget.Snackbar$1.handleMessage(Snackbar.java:162) 
              at android.os.Handler.dispatchMessage(Handler.java:107) 
              at android.os.Looper.loop(Looper.java:214) 
              at android.app.ActivityThread.main(ActivityThread.java:6102) 
              at java.lang.reflect.Method.invoke(Native Method) 
              at java.lang.reflect.Method.invoke(Method.java:372) 
              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 

我使用在许多这样的组合因此我只发布布局代码之一的xmls

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="none"> 

    <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/background" 
     android:orientation="vertical" 
     android:paddingBottom="20dp" 
     android:paddingLeft="20dp" 
     android:paddingRight="20dp" 
     android:paddingTop="10dp"> 

     <com.xsinfosol.emergency.progressbar.RopeProgressBar 
      android:id="@+id/progress_bar1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      app:ropeDynamicLayout="true" 
      app:ropePrimaryColor="@color/red" 
      app:ropeSecondaryColor="#20FFFFFF" 
      app:ropeSlack="0dp" 
      app:ropeStrokeWidth="10dp" /> 

     <ImageView 
      android:id="@+id/iv_default_sos" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_marginTop="40dp" 
      android:src="@drawable/on_light" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="20dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="1" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_health" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/medical" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Health" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="2" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_police" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/police" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Police" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="3" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_fire" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/fire" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Fire" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="4" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_no_4" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/contact_person" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Contact Person 1" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="5" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_no_5" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/contact_person" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Contact Person 2" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:background="@drawable/edittext_bg"> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:layout_width="30dp" 
       android:layout_height="30dp" 
       android:layout_gravity="center_vertical" 
       android:layout_margin="10dp" 
       android:background="@drawable/number_circle" 
       android:gravity="center" 
       android:text="6" 
       android:textColor="@color/red" 
       android:textSize="22sp" /> 

      <com.xsinfosol.emergency.utils.CustomTextView 
       android:id="@+id/tv_view_no_6" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="center_vertical" 
       android:drawableRight="@drawable/contact_person" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       android:text="Contact Person 3" 
       android:textColor="@android:color/white" /> 
     </LinearLayout> 

    </LinearLayout> 
</ScrollView> 

这是我通过api

public void parseSOSResponse(String response) { 
    try { 
     JSONObject jsonObject = new JSONObject(response); 
     String Message=jsonObject.optString("Message"); 
     int error_code = jsonObject.getInt("error_code"); 
     if (error_code == 1) { 
      String num_4 = jsonObject.getString("num_4"); 
      String num_5 = jsonObject.getString("num_5"); 
      String num_6 = jsonObject.getString("num_6"); 
      String health_number=jsonObject.getString("health_number"); 
      String fire_number=jsonObject.getString("fire_number"); 
      String police_number=jsonObject.getString("police_number"); 
      Profile_complete=jsonObject.getInt("Profile_complete"); 
      default_sos = jsonObject.getString("default_sos"); 
      tv_view_no_4.setText(num_4); 
      tv_view_no_5.setText(num_5); 
      tv_view_no_6.setText(num_6); 
      tv_view_fire.setText("Fire \n"+fire_number); 
      tv_view_police.setText("Police \n"+police_number); 
      tv_view_health.setText("Health \n"+health_number); 
      progress_bar1.setMax(100); 
      progress_bar1.animate(); 
      progress_bar1.animateProgress(Profile_complete); 
      prefManager.putString(PrefrenceConstants.KEY_EMERGENCY_TYPE,default_sos); 
     }else{ 
      ((ActivityNavigationDrawer)getActivity()).showSnackBar(iv_default_sos,Message); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

showSnackbar方法

public void showSnackBar(View view, String message) { 
    Snackbar.make(view, message, Snackbar.LENGTH_SHORT).show(); 
} 
+0

显示您的代码添加SnackBar的位置。 – Drv

+0

@Drv添加了相关代码 –

+0

将您的整个代码添加到活动中您的showSnackBar方法在哪里? – Drv

回答

0

正如Marcelo Noguti建议将Scrollview放入 a Coordinator Layout并将其作为小吃棒方法中的视图传递给我解决了这个问题。

0

尝试用宽度和高度设置为包裹包装内容与LinearLayout中孩子解析数据的方法。由于这部分

<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/background" 
    android:orientation="vertical" 
    android:paddingBottom="20dp" 
    android:paddingLeft="20dp" 
    android:paddingRight="20dp" 
    android:paddingTop="10dp"> 
4

的问题是,ScrollViews只能有一个直接的孩子,在你的代码这个孩子是outter线性布局。当小吃店被要求显示时,我想你要求小吃店被画的视图是滚动视图本身,所以会有两个直接的孩子(你的线性布局和现在的小吃店的视图)

+0

我知道,但作为快餐栏将仅显示在出现错误的情况下,它也是动态添加的。也不是每次都发生 –

+1

好吧,明白。那么,我建议你改变快餐栏的视图,因为这是一个简单的改变 - 并将其放在协调器布局中,遵循文档 –