rainer
rainer

Reputation: 3411

Codename One back command update form data

I have an Android application that uses Back Command to go back to the start screen.

The start screen has a label with a number inside, that I want to update when the back command is used.

I could figure out a solution with the code inside the back command, but I don't know if my approach is the best, since the ClassOne gets sort of loaded twice.

Here is the code I already have:

public class ClassOne {

    public ClassOne(ClassPojo classPojo) {

        // I want to change the text of this label when calling the back command
        labelOne.setText(classPojo.getStringTest());
        formOne.show();
    }

}

public class ClassTwo {
        
    public ClassTwo(Form a , ClassPojo classPojo) {     
        Command back = new Command("A") {
            @Override
            public void actionPerformed(ActionEvent evt) {

                // I am adding the new value for the label here inside the back command

                classPojo.setStringTest("testing");
                a.showBack(); 
                new ClassOne(classPojo);
            }
        };
        formTwo.setBackCommand(back);
    }

Upvotes: 2

Views: 127

Answers (3)

rainer
rainer

Reputation: 3411

During testing, I found an easy solution that is adding the label to the constructor. I hope this snippet can be helpful.

public ClassTwo(Form a, ClassPojo classPojo, Label label) { 

    Command back = new Command("A") {
        @Override
        public void actionPerformed(ActionEvent evt) {

        label.setText(classPojo.getStringTest());
        a.showBack(); 
     }
};

Upvotes: 1

Francesco Galgani
Francesco Galgani

Reputation: 6249

I'm not sure what the problem is, your example is a bit generic. However, a complete minimal example where the startScreen form instance is not recreated is this one:

        Form startScreen = new Form("Start screen", BoxLayout.y());
        Wrapper<Integer> count = new Wrapper<>(1);
        Label numberLabel = new Label(count.get() + "");
        Button button1 = new Button("Go to Form 2");
        startScreen.addAll(numberLabel, button1);
        startScreen.show();

        button1.addActionListener(l -> {
            Form form2 = new Form("Form 2", BoxLayout.y());
            Label label = new Label("Use the back button");
            form2.add(label);
            form2.getToolbar().setBackCommand("Back", Toolbar.BackCommandPolicy.ALWAYS, ll -> {
                count.set(count.get() + 1);
                numberLabel.setText(count.get() + "");
                startScreen.showBack();
            });
            form2.show();
        });

If you don't even want to recreate the form2 instance, then you can do so:

        Form startScreen = new Form("Start screen", BoxLayout.y());
        Wrapper<Integer> count = new Wrapper<>(1);
        Label numberLabel = new Label(count.get() + "");
        Button button1 = new Button("Go to Form 2");
        startScreen.addAll(numberLabel, button1);
        startScreen.show();

        Form form2 = new Form("Form 2", BoxLayout.y());
        Label label = new Label("Use the back button");
        form2.add(label);
        form2.getToolbar().setBackCommand("Back", Toolbar.BackCommandPolicy.ALWAYS, ll -> {
            count.set(count.get() + 1);
            numberLabel.setText(count.get() + "");
            startScreen.showBack();
        });

        button1.addActionListener(l -> {
            form2.show();
        });

In my opinion, whether or not to recreate the instances of a Form should be evaluated on a case-by-case basis. Among the variables between taking into consideration, according to my modest opinion, there is also the readability of the code and what it does, especially in complex cases.

Upvotes: 1

Shai Almog
Shai Almog

Reputation: 52760

The overhead of recreating a form instance is negligible so that wouldn't be a problem but in recent years we try to reuse form instances more. Not because of the performance.

The benefit is in minor behaviors e.g. scroll position within the form. These are very hard to replicate.

Upvotes: 1

Related Questions