2013-12-11 5 views
2

Я пытаюсь создать макет деятельности следующим образом: enter image description hereДобавить Вертикальная и горизонтальная прокрутка программно LinearLayout в Android

game_board.xml код будет следующим:

<LinearLayout 
     android:id="@+id/layoutFilterContent" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:weightSum="4" 
     android:background="#837E7C" > 

     <LinearLayout 
      android:id="@+id/layoutTopicGrade" 
      android:orientation="vertical" 
      android:layout_width="0dp" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:padding="0dp" 
      android:background="#BCC6CC" > 

     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/layoutGames" 
      android:orientation="vertical" 
      android:layout_width="0dp" 
      android:layout_height="fill_parent" 
      android:layout_weight="3" 
      android:padding="0dp" 
      android:background="#E5E4E2" > 

     </LinearLayout> 

    </LinearLayout> 

java код в GameBoardActivity.java выглядит следующим образом:

import android.os.Bundle; 
import android.annotation.SuppressLint; 
import android.app.ActionBar.LayoutParams; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 

public class GameBoardActivity extends Activity { 

    LinearLayout topicGrade; 
    LinearLayout gameContent; 
    ScrollView scroll; 
    ImageButton[] imgBtn; 

    @SuppressWarnings("deprecation") 
    @SuppressLint({ "NewApi", "InlinedApi", "ResourceAsColor" }) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.game_board); 

     topicGrade = (LinearLayout)findViewById(R.id.layoutTopicGrade); 

     scroll = new ScrollView(this); 
     scroll.setBackgroundColor(android.R.color.transparent); 
     scroll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     scroll.addView(topicGrade); 

     imgBtn = new ImageButton[15]; 

     for(int i=0;i<15;i++){ 
      imgBtn[i] = new ImageButton(this); 
      imgBtn[i].setId(i); 
      imgBtn[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); 
      topicGrade.addView(imgBtn[i]); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.game_board, menu); 
     return true; 
    } 

} 

я получаю error как: The specified child already has a parent. You must call removeView() on the child's parent first.

Я первый попытался добавить кнопки LinearLayout1 без ScrollView, и я могу добавить кнопки, как я хочу, но когда я реализую ScrollView я получаю сообщение об ошибке, как указано выше. Так что я застрял и не пытался что-либо на LinearLayout2

Пожалуйста, кто поможет мне проектировать деятельность, показанную выше,

+0

я добавил XML вам нужно мой ответ – 2red13

ответ

1

Что вы хотите делать achiev? это то, что вы на самом деле делаете:

setContentView(R.layout.game_board); 

-> game_board является inflatet как с Чайлдс layoutTopicGrade и layoutGames

topicGrade = (LinearLayout)findViewById(R.id.layoutTopicGrade); 

-> это экземпляр layoutTopicGrade

scroll = new ScrollView(this); 

-> Вам создать прокрутку

scroll.addView(topicGrade); 

-> добавить topicGrade к просмотру прокрутки

Это не удалось, потому что topicGrade уже имеет родителя (layoutFilterContent)

this.setContentView(scroll); 

-> вы установили Кролл вид, как содержание.
(почему вы установили R.layout.game_board как содержание раньше?)

если вы хотите только topicGrade в ScrollView как ContentView, почему вы не создать XML с этой структурой?

если это рекомендуется делать это, как вы делаете, решение:

topicGrade = (LinearLayout)findViewById(R.id.layoutTopicGrade); 
((LinearLayout)topicGrade.getParent()).removeView(topicGrade) 

, но я не могу понять, почему вы должны сделать это таким образом ^^

--edit-key: Теперь у меня есть это, вот что вам нужно:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="4" > 

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_weight="1"> 
    <LinearLayout 
     android:id="@+id/vertical_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 
    </LinearLayout> 
</ScrollView> 

<HorizontalScrollView 
    android:id="@+id/horizontalScrollView1" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_weight="3"> 

    <LinearLayout 
     android:id="@+id/horizontal_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" > 
    </LinearLayout> 
</HorizontalScrollView> 
</LinearLayout> 
+0

Благодарим за отзыв. строка 'this.setContentView (scroll);' была добавлена ​​по ошибке, я удалил эту строку. Я хочу разделить «активность» на 2 части '(Скажем, если 4 является тотальным, то 1/4 и 3/4)', как я упомянул в своем вопросе, и вы можете увидеть Макет в представленном мной изображении. Как я могу разделить макет на '1/4' с помощью' Vertical Scroll' и '3/4' с' Horizontal Scroll'? – Sush19

1

Каждый элемент может иметь ровно один из родителей, что это XML-файл структура.

В вашем файле xml макета вы определили layoutTopicGrade как ребенок layoutFilterContent. Затем, в коде, вы устанавливаете layoutTopicGrade в качестве ребенка вновь созданного ScrollView.

Вы должны обернуть layoutTopicGradeScrollView. Кроме того, поскольку вы не делаете любую динамическую конфигурацию в ScrollView, нет никаких причин, добавив его в коде, вы должны сделать это прямо в файле макета XML:

<ScrollView android:id="@+id/scrollViewTopicGrade" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/transparent" > 
    <LinearLayout 
     android:id="@+id/layoutTopicGrade" 
     android:orientation="vertical" 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:padding="0dp" 
     android:background="#BCC6CC" > 
    </LinearLayout> 
</ScrollView> 

EDIT

для того, чтобы иметь layoutTopicGrade занять 25% ширины родителя и layoutGames взять 75%, сделайте следующее:

  1. M оставьте layout_weight и layout_width от layoutTopicGrade до ScrollView.
  2. ScrollViewlayout_weight до .25.
  3. layoutGameslayout_weight до .75.
  4. layoutTopicGrade детей должны иметь layout_width установить на fill_parent.

См. this answer.


Сложение

Кстати, выглядит линия this.setContentView(scroll); должна быть удалена. Activity.setContentView используется для установки вида для всего действия = весь экран. Но ваш ScrolView, по-видимому, только для макета темы.Скорее всего игровая доска - это представление содержимого активности, поскольку вы используете его несколько строк кода раньше: setContentView(R.layout.game_board); (так что держите его).

+0

Спасибо за ваш ответ. строка 'this.setContentView (scroll);' была добавлена ​​по ошибке, я удалил эту строку. Как вы сказали использовать '' непосредственно в 'xml'. Если я буду использовать '' непосредственно в 'xml', который я разместил в вопросе, я не получу два параллельных макета. – Sush19

+0

@ Sush19 В любом случае, вы смотрите на него, вы можете и должны делать это в xml. Вы пытались переместить вес в 'ScrollView'? – yair

+0

@ Sush19 (1) переместите 'layout_weight' и' layout_width' из 'layoutTopicGrade' в' ScrollView'. (2) установите 'layout_weight'' ScrollView' '' .25'. (3) установите 'layout_weight'' layoutGames' '' .75'. (4) У детей 'layoutTopicGrade' должно быть' layout_width' установлено значение 'fill_parent'. – yair

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