Есть ли способ создать фрагмент общего класса в Android? - PullRequest
1 голос
/ 08 мая 2019

По сути, моя проблема сводится к тому, что метод в абстрактном суперклассе не может быть одновременно абстрактным и статическим (то есть статические методы не могут быть переопределены в Java), и поэтому я не могу "утверждать", что мой Пользовательский фрагмент имеет метод newInstance (HashMap), если весь код знает, что он пытается создать фрагмент.

Вероятно, это действительно сбивало с толку, поэтому позвольте мне объяснить подробнее. У меня есть некоторый код, который автоматически создает серию фрагментов для отображения на основе ArrayList «parameterList» HashMaps. (Т.е. параметрList.get (3) будет параметрами для 3-го фрагмента).

public void setupFragments()
{
    ArrayList<HashMap<String, Object>> parameterList = new ArrayList<>();
    ...
    ...
    for(HashMap<StringObject> fragmentParams : parameterList){
        createNewFragment(...)
    }
}

private void createNewFragment(...){
    ...
}

У меня есть несколько различных типов (классов) фрагментов, которые все наследуются от абстрактного класса, называемого «GameFragment», который сам расширяет фрагмент.

Что я хотел бы сделать, так это добавить к параметрам любого данного фрагмента класс / тип фрагмента. То есть как то так:

public class ATypeOfFragment extends GameFragment{...}

public class AnotherTypeOfFragment extends GameFragment{...}

public abstract class GameFragment extends Fragment{...}
public void setupFragments()
{
    ArrayList<HashMap<String, Object>> parameterList = new ArrayList<>();

    HashMap<String, Object> firstFragmentParams = new Hashmap<>();
    firstFragmentParams.put("fragmentType", ATypeOfFragment.class);
    parameterList.add(firstFragmentParams);


    HashMap<String, Object> secondFragmentParams = new Hashmap<>();
    firstFragmentParams.put("fragmentType", AnotherTypeOfFragment.class);
    parameterList.add(secondFragmentParams);


    for(HashMap<StringObject> fragmentParams : parameterList){
        createNewFragment((Class<GameFragment>) fragmentParams.get("fragmentType"))
    }
}

private void createNewFragment(Class<GameFragment> class){
    ...
}

Теперь проблема в том, есть ли способ заставить эту работу? Есть ли способ, которым я могу написать функцию createNewFragment, где он будет создавать фрагмент указанного класса?

Во-первых, я еще не очень хорошо понимаю общие классы (как вы, вероятно, можете сказать).

Во-вторых, другая проблема заключается в том, что, поскольку это фрагмент Android, я не могу изменить или даже вызвать конструктор. Фрагменты Android создаются с помощью статической функции "newInstance (...)".

Теперь вы можете начать видеть проблему. То, что я хотел бы сделать, - это иметь абстрактный статический метод "newInstance (...)" в GameFragment (или другой интерфейс, если необходимо), чтобы моя функция createNewFragment могла просто вызывать "class.newInstance (...)".

public abstract class GameFragment extends Fragment{
    ...
    public abstract static GameFragment newInstance(...);
}
private void createNewFragment(Class<GameFragment> class){
    GameFragment newFragment = class.newInstance(...); 
    //Not that this would work anyway, again I don't understand generic classes very well yet
}

Однако в Java нельзя иметь метод, который может быть как абстрактным, так и статическим.

Есть ли какой-нибудь альтернативный способ сообщить моей программе, что универсальный класс гарантированно имеет определенный статический метод?

Если нет, я просто создам функцию «словарь», которая отображает определенные строки в функцию newInstance (...) всех моих классов (Game) Fragment. Однако, конечно, я бы предпочел не выполнять этот тип «ведения домашнего хозяйства» всякий раз, когда я расширяю свое приложение новыми типами фрагментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...