2015-01-12 3 views
2

참고 : 내 문제는 : 처음으로 글자를 클릭하면 가로보기에서 데이터를로드하지만 두 번째 글자를 클릭하면 다음 글자, 내가안드로이드에서 각각의 데이터로 다른 글자를 클릭 할 때 가로 레이아웃을 새로 고치는 방법

java.lang.IllegalStateException: HorizontalScrollView can host only one direct child 
at android.widget.HorizontalScrollView.addView(HorizontalScrollView.java:213) 

을 얻고있다 그래서 나는 많은 시간을 노력하지만, 이전 데이터 뷰를 제거 할 수없는 새로운 데이터가 서로 다른 문자를 클릭 할 때마다 볼, 이전 뷰의 데이터 항목을 추가하려고합니다.

저는 탭과 같은 텍스트 뷰에서 A부터 Z까지의 문자가 있습니다.

A B C D........X Y Z. 

horizontalview with no data if no select 

을 클릭하거나 A를 선택하면됩니다. display 관련 데이터를 가로보기로 표시합니다. 동그라미 배경.

A B C.......X Y Z 
    Apple  Aeroplane Argo 
    5 kg  100   9  and many more 

내가 D를 클릭하거나 선택하면. display 관련 데이터를 가로보기로 표시합니다. 동그라미 배경.

A B C.......X Y Z 
    Duck  Dog 
    5 kg  12  and many more 

하지만 오류를

01-12 16:21:19.031: E/AndroidRuntime(16246): java.lang.IllegalStateException: HorizontalScrollView can host only one direct child 
01-12 16:21:19.031: E/AndroidRuntime(16246): at android.widget.HorizontalScrollView.addView(HorizontalScrollView.java:213) 

을 발생하고 내가 내 코드에서 한, 당신이 제안을 전해 주 시겠어요하시기 바랍니다 경우 다음 D를 클릭하면, 같은 시간을 표시 할 수 있습니다.

for (int j = 0; j < letters.length; j++) { 
     btnTag = new PlanTextView(mContext); 
     btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     btnTag.setText(letters[j].toString()); 
     btnTag.setPadding(6, 6, 6, 6); 
     btnTag.setTextSize(20); 
     btnTag.setId(j + 1); 
     listBtnTag.add(btnTag); 
     final int index = j; 
    btnTag.setOnClickListener(new OnClickListener() { 
       private boolean stateChanged = true; 
       private boolean flag; 
       private LinearLayout yelloDetailsLinearLayout1; 
       private LinearLayout innerYello1; 

       @SuppressLint("NewApi") 
       public void onClick(View v) { 
        yelloDetailsLinearLayout1 = new LinearLayout(mContext); 
        // letterLinear.setPadding(5, 5, 5, 5); 
        yelloDetailsLinearLayout1.setOrientation(LinearLayout.HORIZONTAL); 
        yelloDetailsLinearLayout1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
        innerYello1 = new LinearLayout(mContext); 
        // letterLinear.setPadding(5, 5, 5, 5); 
        innerYello1.setOrientation(LinearLayout.HORIZONTAL); 
        innerYello1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 


        // displayYello(btnTag.getText().toString()); 

        List<String> sorted = new ArrayList<String>(); 
        sorted = SortedList(listBtnTag.get(index).getText() 
          .toString(), yellonameList); 
        if (sorted.size() == 0) { 
         Toast.makeText(mContext, "No Yello Page Found", 
           Toast.LENGTH_SHORT).show(); 
        } else { 


         for (int i = 0; i < sorted.size(); i++) { 

          LinearLayout rowletter1 = new LinearLayout(mContext); 
          rowletter1.setOrientation(LinearLayout.VERTICAL); 
          rowletter1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
          rowletter1.setPadding(10, 0, 0, 0); 

          tvde = new TextView(mContext); 
          tvde.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

          btnNumber = new Button(mContext); 
          btnNumber.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

          String[] spits = sorted.get(i).toString().split("\\,"); 
          tvde.setText("Your Selected=" + spits[0].toString()); 

          btnNumber.setText(spits[1].toString()); 
          rowletter1.addView(tvde); 
          rowletter1.addView(btnNumber); 
          innerYello1.addView(rowletter1); 
          flag=true; 
         } 
         yelloDetailsLinearLayout1.addView(innerYello1); 
         horizontalScrollview.addView(yelloDetailsLinearLayout1); 
        } 
        for (int i = 0; i < listBtnTag.size(); i++) { 
         if (v.getId() == index) { 
          // reset background to default; 
          listBtnTag.get(index).setBackgroundResource(
            R.drawable.circel_off); 
         } else { 
          listBtnTag.get(index).setBackgroundResource(
            R.drawable.circel_on); 
         } 
         stateChanged = !stateChanged; 
        } 

       } 
      }); 
      rowletter.addView(btnTag); 

     } 
+0

오류가 레이아웃을 참조한 것으로 보입니다. 스크롤보기에는 자식이 하나만있을 수 있습니다.RelativeLayout 주위에 스크롤 뷰를 감싸고 모든 자식을이 상대 레이아웃 안에 배치합니다. – Skynet

답변

2

달성하려는 기능은 더 간단한 방법으로 얻을 수 있습니다. 제 솔루션에서는 위의 버튼 수가 항상 A에서 Z로 가정하고 표시해야하는 데이터는 항상 동일한 형식을 취한다고 가정합니다. 이제

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <HorizontalScrollView 
     android:id="@+id/horizontal_scrollview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="50dp" 
     android:alignParentTop="true" > 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 

      <Button 
       android:id="@+id/a_button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/a" /> <!-- declare a as A in string.xml --> 

      <Button 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/b" /> 

      <!-- do this till Z --> 

     </LinearLayout> 
    </HorizontalScrollView> 



    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/horizontal_scrollview" 
     android:layout_alignParentBottom="true"> 

     <!-- your layout to show data here. Showing a sample value for reference --> 
     <TextView 
      android:id="@+id/ursel_textview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/your_selected"/> <!-- declare your_selected as Your selected in string.xml --> 

    </RelativeLayout> 
</RelativeLayout> 

이 조각/활동의 클래스에 기반을 둔 urSelTextView하는

@Override 
public void onCreate(Bundle savedInstance) { 
super.onCreate(savedInstance); 
Button aButton = (Button) this.findViewById(R.id.a_button); 
final TextView urSelTextView = (TextView) this.findViewById(R.id.ursel_textview); 
//set the Alphabets click listeners to set the values of data fields accordingly 
aButton.setOnClickListener(new View.OnClickListener(){ 
    @Override onClick(View v) { 
    //do things to set data's layout to show data relevant for A button 
    urSelTextView.setText("set A's data here."); 
    } 
}); 
} 

(26) 리스너 설정하고 적절한 데이터를 만들기에서 onCreate 방법으로 이동 대신 하위 클래스 LinearLayout의 ,이 같은 XML 파일을 생성 버튼을 클릭합니다. 또한 액티비티가 OnClickListener을 구현하도록하고 모든 코드를 하나의 공통된 onClick 함수를 액티비티로 구현하여 작성할 수 있습니다. 아직이 코드를 테스트하지 않았습니다. 몇 가지 개선이 필요할 수 있습니다. 그러나 전반적으로 당신은 그것으로부터 아이디어를 얻어야합니다.

수정 : 다음은 요청한대로 수정 된 코드입니다. 나는 그것을 시도하지 않은하지만 난 당신이 기본적으로 새 것으로짜리 아이 레이아웃을 대체이 솔루션에서 멤버 변수

public class YourClass extends Activity { 

private LinearLayout mYelloDetailsLinearLayout; //stores the currently added layout 



//later in your code 

for (int j = 0; j < letters.length; j++) { 
    btnTag = new PlanTextView(mContext); 
    btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    btnTag.setText(letters[j].toString()); 
    btnTag.setPadding(6, 6, 6, 6); 
    btnTag.setTextSize(20); 
    btnTag.setId(j + 1); 
    listBtnTag.add(btnTag); 
    final int index = j; 
    btnTag.setOnClickListener(new OnClickListener() { 
      private boolean stateChanged = true; 
      private boolean flag; 
      private LinearLayout yelloDetailsLinearLayout1; 
      private LinearLayout innerYello1; 

      @SuppressLint("NewApi") 
      public void onClick(View v) { 



       yelloDetailsLinearLayout1 = new LinearLayout(mContext); 
       // letterLinear.setPadding(5, 5, 5, 5); 
       yelloDetailsLinearLayout1.setOrientation(LinearLayout.HORIZONTAL); 
       yelloDetailsLinearLayout1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
       innerYello1 = new LinearLayout(mContext); 
       // letterLinear.setPadding(5, 5, 5, 5); 
       innerYello1.setOrientation(LinearLayout.HORIZONTAL); 
       innerYello1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 


       // displayYello(btnTag.getText().toString()); 

       List<String> sorted = new ArrayList<String>(); 
       sorted = SortedList(listBtnTag.get(index).getText() 
         .toString(), yellonameList); 
       if (sorted.size() == 0) { 
        Toast.makeText(mContext, "No Yello Page Found", 
          Toast.LENGTH_SHORT).show(); 
       } else { 


        for (int i = 0; i < sorted.size(); i++) { 

         LinearLayout rowletter1 = new LinearLayout(mContext); 
         rowletter1.setOrientation(LinearLayout.VERTICAL); 
         rowletter1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
         rowletter1.setPadding(10, 0, 0, 0); 

         tvde = new TextView(mContext); 
         tvde.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

         btnNumber = new Button(mContext); 
         btnNumber.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

         String[] spits = sorted.get(i).toString().split("\\,"); 
         tvde.setText("Your Selected=" + spits[0].toString()); 

         btnNumber.setText(spits[1].toString()); 
         rowletter1.addView(tvde); 
         rowletter1.addView(btnNumber); 
         innerYello1.addView(rowletter1); 
         flag=true; 
        } 
        yelloDetailsLinearLayout1.addView(innerYello1); 


        /*********** remove the previously added mYelloDetailsLinearLayout here******/ 
        horizontalScrollView.removeView(mYelloDetailsLinearLayout); 



        /*********** add the newly created mYelloDetailsLinearLayout here******/ 
        mYelloDetailsLinearLayout = yelloDetailsLinearLayout1; 
        horizontalScrollview.addView(mYelloDetailsLinearLayout); 
       } 
       for (int i = 0; i < listBtnTag.size(); i++) { 
        if (v.getId() == index) { 
         // reset background to default; 
         listBtnTag.get(index).setBackgroundResource(
           R.drawable.circel_off); 
        } else { 
         listBtnTag.get(index).setBackgroundResource(
           R.drawable.circel_on); 
        } 
        stateChanged = !stateChanged; 
       } 

      } 
     }); 
     rowletter.addView(btnTag); 

    } 

로 수업 저장합니다 yelloDetailsLinearLayout1에서

일을한다고 생각합니다. 따라서 HorizontalScrollView는 항상 하나의 자식을 가지며 오류가 발생하지 않습니다. 하지만 레이아웃 파일을 사용하는 것이 더 쉽고 유지 관리가 쉽기 때문에 가능한 한 많이 레이아웃 파일에 의존 할 것을 제안합니다. 나는 내 시스템에서 이걸 실행하지 않았다. 그러나 그것이 효과가 있다고 생각합니다.

+0

프로그래밍 방식으로하고 싶습니다. 어떻게 할 수 있습니까? 및 기타 내 코드에서 오류를 찾을 수 있습니까? – user2340490

+0

그것이 작동하지 않습니다, 이전 레이아웃에 추가합니다. 처음 123 123 둘째 시간 123674. – user2340490

+0

정말 고마워. 그것은 나를 위해 매우 도움이됩니다. – user2340490