Wykorzystanie własnej klasy we Fragmencie

0

Cześć,

mamy klasę HomeFragment.java z kodem:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        // Inflate the layout for this fragment

        return rootView;
    }

Stworzyliśmy też klasę ListGenerator.java z kodem:

public class ListGenerator extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ListView lista = (ListView) findViewById(R.id.lista);
        String[] lista_nazwisk = {"Krzysztof", "Bartek ", "Kamil "};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lista_nazwisk);
        lista.setAdapter(adapter);


    }
}

Chcemy aby HomeFragment.java wyświetlał elementy pobrane z tablicy z klasy ListGenerator - jak powinnyśmy to zrobić?

fragment_home.xml: http://pastebin.com/Lw7L2ikX

1

jest na to 1000 sposobów

najprostszy ale i najbrzydszy to zrobić metodę w Activity ListGenerator publiczną np.


public MyObject getData(){
MyObject myObjectWithData=new MyObject();
return myObjectWithData
} 

a później we fragmencie tylko to wywolac

((ListGenerator)(getActivity)).getData();

proponuję poczytać
http://developer.android.com/reference/android/app/Fragment.html

pozdro

0

Metod jest kilka. Jedna to stworzenie obiektu Bundle, gdzie wkładamy sobie dane (np. putString), następnie tworzymy fragment i na obiekcie zawierającym fragment wywołujemy metodę setArguments(bundle). Inna metoda to dostanie się z poziomu fragmentu do activity za pomocą metody getActivity() i odczytanie pola obiektu activity. Poza tym można jeszcze użyć bazy danych i ContentProvider albo od biedy SharedPreferences, chociaż SharedPreferences są do przechowywania ustawień, a nie danych. Wszystko zależy od konkretnego przypadku.

1

Skoro zaprzęgłeś już do tego adapter to dlaczego nie umieścisz tego listview w HomeFragment?
Nie bardzo widzę sens mieszania Fragmentów i Activity.
Jeśli już koniecznie chcesz to zrobić, możesz to zrobić Callback'iem (dość ładny i czytelny sposób).

0

Jeśli są to na sztywno wbite 3 stringi, które używasz w kilku miejscach to lepiej je wrzuć do resources/values/strings.xml jako string-array:

<string-array name="lista_nazwisk">
        <item>Krzysztof</item>
        <item>Bartek </item>
        <item>Kamil</item>
    </string-array>

potem jeśli potrzebujesz tablicy to masz do niej dostęp za pomocą komendy:

getResources().getStringArray(R.array.lista_nazwisk)

0
Haskell napisał(a):

Metod jest kilka. Jedna to stworzenie obiektu Bundle, gdzie wkładamy sobie dane (np. putString), następnie tworzymy fragment i na obiekcie zawierającym fragment wywołujemy metodę setArguments(bundle). Inna metoda to dostanie się z poziomu fragmentu do activity za pomocą metody getActivity() i odczytanie pola obiektu activity. Poza tym można jeszcze użyć bazy danych i ContentProvider albo od biedy SharedPreferences, chociaż SharedPreferences są do przechowywania ustawień, a nie danych. Wszystko zależy od konkretnego przypadku.

ContentProvider? Ale po cholerę? To się przydaje gdy chcesz udostępnić dane innym aplikacjom.

Tak w ogóle to nie rozumiem czemu źródło danych jakim jest tablica stringów jest na sztywno przywiązane do jednego activity skoro ma być wykorzystywane jeszcze w innych miejscach. Ja bym stworzył oddzielną klasę, której metody zwracają dane, widoczną z poziomu kazdego activity i fragmentu, który tych danych potrzebuje

0

ListGenerator dziedziczy po Activity! Ewidentnie zła nazaw, nazwa sugeruje generator list, a lista to struktura danych. Pomyśl na nową nazwą.

To co potrzebujesz to content provider, doczytaj tutoriale Androida, albo pooglądaj filmiki:

I tak można to zrobić na wiele innych sposobów, ale w ten sposób nie nauczysz się robić tego dobrze, więc radzę ci skupić się na content provider.
Pamiętaj, że Activity przy zmianie konfiguracji jest tworzone na nowo, a to przynosi poważne konsekwencję dla różnych źródeł danych.

0
MarekR22 napisał(a):

I tak można to zrobić na wiele innych sposobów, ale w ten sposób nie nauczysz się robić tego dobrze, więc radzę ci skupić się na content provider.

Polemiziwałbym czy używanie armaty na muchę to dobrze. Wg mnie niekoniecznie.

0

Widać, że podany kod zostały napisany przez początkującego, pewnie z jakiegoś tutoriala. Proponowanie w tej sytuacji Content Provider to przerost formy nad treścią. Autor powinien się najpierw nauczyć najprostszych rzeczy. Poza tym sam Google na developer.android.com pisze, że:

You don't need to develop your own provider if you don't intend to share your data with other applications.

a wątpię żeby to był cel autora.

0

No przecież od początku o tym mówię. Poza tym implementacja ContentProvidera wg mnie cokolwiek dziwna jest - możesz otworzyć połączenie a nie możesz zamknąć, wtf jak dla mnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1