Codemane One call Back Command от второго класса - PullRequest
1 голос
/ 09 мая 2020

Итак, у меня есть приложение Android с двумя классами, A и B. Лог c для обратной команды настроен в классе A и работает, как ожидалось: действие кнопки показывает форму B, а Кнопка Escape возвращает форму A.

Теперь, после загрузки формы в класс B, мне нужно «перезагрузить» ее. Я делаю это, создавая новую форму, снова вызывая весь класс с помощью кнопки.

В процессе команда возврата перестает работать (и кнопка команды появляется на панели инструментов), поскольку все компоненты (панель инструментов, форма и т. Д. c.) Созданы заново и отсутствуют. определения из класса A.

Мой вопрос: можно ли определить logi c обратной команды внутри класса B, а не в классе A, чтобы обратная команда все еще работала после перезагрузки класса B или как-то определить ссылки на класс А, чтобы он работал?

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

public class ClassA {

    private Command back; 
    private ClassB classB;
    private Form current;
    private Resources theme;
    private  Form formA;
    private Button button = new Button("Go forward");

    public void loadA() {

        showBack();

        formA = new Form("Old Form", BoxLayout.y());            
        classB = new ClassB();

        button.addActionListener(l -> {

            classB = new ClassB();
            classB.formB.getToolbar().setBackCommand(back);
            classB.formB.setBackCommand(back);

            classB.goBack();

            Button buttonToolbar = classB.formB.getToolbar().findCommandComponent(back);

            FontImage image = FontImage.createMaterial(FontImage.MATERIAL_10K, "test", 4);
            buttonToolbar.setIcon(image);


        });

        formA.add(button);
        formA.show();
    }

    public void showBack() {

        back = new Command("Back") {
                @Override
                public void actionPerformed(ActionEvent evt) {
                        formA.showBack();
                }
        };
    }

}

public class ClassB {

    public ClassA classA = new ClassA();
    public Form formB = new Form("New Form", BoxLayout.y());
    private Button buttonReload = new Button("Reload");

    public void reload () {

        buttonReload.addActionListener(l -> {

            ClassB classB = new ClassB();
            classB.reload();

            // I want to recreate the back-command logic here in Class B. 
            // The below doesn't work. 

            formB.getToolbar().setBackCommand(new Command("back"));

        });

        formB.add(buttonReload);
        formB.show();

    }

}

Ответы [ 2 ]

1 голос
/ 13 мая 2020

Ниже представлен механизм, который я использую. Это то, что вы спрашиваете?

public class A extends Form {
    public A() {
        super("A"); // set title
        Button b = new Button("B");
        b.addActionListener((ActionListener) (ActionEvent evt) -> {
            new B(this).show();
        });
        add(b);
    }
}

public class B extends Form {
    public B(Form a) {
        super("B"); // set title
        Command back = new Command("A") {
            @Override
            public void actionPerformed(ActionEvent evt) {
                a.showBack();
            }
        };
        getToolbar().setBackCommand(back);
    }
}

Предполагая Toolbar.setGlobalToolbar (true). На самом деле мой код для setBackCommand немного сложнее:

getToolbar().setBackCommand(back,
    Toolbar.BackCommandPolicy.WHEN_USES_TITLE_OTHERWISE_ARROW); 
Button backButton = getToolbar().findCommandComponent(back); 
FontImage.setMaterialIcon(backButton,
    ios() ? FontImage.MATERIAL_ARROW_BACK_IOS
          : FontImage.MATERIAL_ARROW_BACK);

Я предполагаю, что после a.showBack () форма B имеет право на сборку мусора. Если приведенный выше механизм неверен, мне очень интересно узнать, какой правильный механизм (Шай?).

Изменить: или без расширения класса Form:

void showA() {
    Form a = new Form("A");
    Button b = new Button("B");
    b.addActionListener((ActionListener) (ActionEvent evt) -> {
        showB(a);
    });
    a.add(b);
    a.show();
}

void showB(Form a) {
    Form b = new Form("B");
    Command back = new Command("A") {
        @Override
        public void actionPerformed(ActionEvent evt) {
            a.showBack();
        }
    };
    b.getToolbar().setBackCommand(back);
    b.show();
}
1 голос
/ 10 мая 2020

Я не следую в точности logi c, но если вы динамически обновляете экземпляры форм, возможно, вам следует просто переместить logi c навигации в центральный класс, например, менеджер навигации, который также может вызывать logi c из создание формы при необходимости например:

interface DynamicForm {
    public String getFormName();
    public Form createFormInstance();
}


public class NavigationManager {
    // ...
    public void register(DynamicForm df) {
        formRegistryMap.put(df.getFormName(), df);
    }

    public void clearFormCache() {
        formCache.clear();
    }

    public Form getFormInstance(String formName) {
        Form formCache = formCache.get(formName);
        if(formCache != null) {
            return formCache;
        }
        formCache = formRegistryMap.get(formName).createFormInstance();
        formCache.put(formName, formCache);
        return formCache;
    }
    // ...
}
...