2012-09-14 15 views
7

Mam LinearLayout, który zawiera TextView i zawsze będzie. Zawsze znajdzie się co najmniej jeden przycisk pod tekstem, ale w pewnych okolicznościach może być ich więcej.Tworzenie przycisków Android programowo za pomocą układu XML jako szablonu

Mogę skutecznie tworzyć i dodawać tyle przycisków, ile potrzebuję programowo. Mogę również z powodzeniem programować dowolne parametry/opcje związane z wyglądem dla tych przycisków.

Problem polega na tym, że nie wiem, jak powiedzieć programowo utworzonemu przyciskowi, że powinien on używać pliku zasobów XML, który zawiera parametry wyglądu i układu, zamiast ustawiania tych parametrów programowo.

Przyjrzałem się podobnie nazwanym pytaniom i spędziłem trochę czasu z samym API, bezskutecznie.

Edit:
Oto przybliżeniem co próbuję zrobić, które miejmy nadzieję uczynić wyjaśnień nieco jaśniejsze dla mnie:

private TextView textView; 
private SomeObject someObject; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View scrollView = inflater.inflate(R.layout.fragment_play_game, container, false); 
    textView = (TextView) scrollView.findViewById(R.id.game_data_text); 
    textView.setText(someObject.getTextForTextView()); 

    LinearLayout layout = (LinearLayout) scrollView.findViewById(R.id.game_data_container); 
    for (String optionText : someObject.getTextForButtons()) { 
     layout.addView(createOptionButton(optionText, layout)); 
    } 
    return scrollView; 
} 

private View createOptionButton(String optionText, LinearLayout layout) { 
    Button optionButton = new Button(this.getActivity()); 
    // set button layout/options here, somehow?? 
    optionButton.setText(optionText); 
    return optionButton; 
} 

Mój plik XML szablonu dla fragmentu wygląda następująco (Jest to LinearLayout że Próbuję dodać przyciski do):

<?xml version="1.0" encoding="utf-8"?> 

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/game_data_container" 
     etc... > 

     <TextView 
      android:id="@+id/game_data_text" 
      etc... /> 

    </LinearLayout> 

</ScrollView> 

Ponadto, jeśli jestem, aby utworzyć plik XML układ dla przycisku (pozwala wywołać custom_button.xml) powinien wyglądać tak ?:

<?xml version="1.0" encoding="utf-8"?> 
    <Button xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/play_game_option_button" 
     etc... /> 

Aktualizacja:
Wystarczy poszerzyć trochę na co MrFox @ mówi się o to, co zrobiłem, aby uzyskać jego pracy było zastąpić ten wiersz:

Button optionButton = new Button(this.getActivity()); 

z tego:

Button optionButton = (Button) inflater.inflate(R.layout.play_game_option_button, layout, false); 

... co powoduje zawyżenie pliku xml zawierającego tylko układ przycisków (szablon przycisku). W takim przypadku zwraca główny widok tego pliku, który jest po prostu przyciskiem, ponieważ nad przyciskiem w pliku nie ma elementu nadrzędnego.

Jednakże, jeśli ustawiłem ostatnią wartość logiczną (attachToParent) na wartość true, zwróciłoby to kontener główny, w którym znajduje się przycisk (co jest po prostu zmienną "layout", która została przekazana do wywołania) .

Mogę teraz tworzyć tyle przycisków, ile chcę, korzystając z tego szablonu.

Odpowiedz

5

Czy myślałeś o stworzeniu układu, który jest tylko przyciskiem z zastosowanymi stylami XML, a następnie nadmuchaniem go do układu liniowego?

coś takiego:

inflater.inflate (R.layout.StyledButton, MyLinearLayout, true);

+1

Dzięki za odpowiedzi, próbowałem zabawy z co się sugeruje, ale ja naprawdę nie rozumiem jak wdrożyć to, co sugerujesz. Zaktualizowałem moje oryginalne pytanie z dodatkowymi informacjami. – Rob

+0

Ty i ja –

+0

Dzięki @Rob za rozszerzenie mojej odpowiedzi! –

1

xml dla przycisku pod /res/layout/my_button_layout.xml

<Button xmlns:android="http://schemas.android.com/apk/res/android" 
    ... /> 

kodu w swojej działalności

myButton = (Button)inflate.inflate(R.layout.my_button_layout, null); 
myView.addView(myButton); 
Powiązane problemy