Форма не отображается при втором вызове - PullRequest
0 голосов
/ 10 января 2019

Я сделал простое боковое меню для приложения. При первом вызове меню. Меню показывает нормально.

При повторном вызове меню во второй раз я вижу пустой экран.

Вот как я строю меню:

package com.mainsys.zappeion;


import static com.codename1.ui.CN.*;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
import com.codename1.io.Log;
import com.codename1.ui.Toolbar;
import com.codename1.ui.FontImage;

/**
 * This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose 
 * of building native mobile applications using Java.
 */
public class Zappeion {

    private Form current;
    private Resources theme;

    public void init(Object context) {
        // use two network threads instead of one
        updateNetworkThreadCount(2);

        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);

        // Pro only feature
        Log.bindCrashProtection(true);

        addNetworkErrorListener(err -> {
            // prevent the event from propagating
            err.consume();
            if(err.getError() != null) {
                Log.e(err.getError());
            }
            Log.sendLogAsync();
            Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
        });        
    }

    public void start() {

        if(current != null){
            current.show();
            return;
        }

        Toolbar tb =    new Toolbar();

        Statues statues = new Statues();
        statues.setToolbar(tb);
        tb.addMaterialCommandToSideMenu("Αγάλματα", FontImage.MATERIAL_ALBUM, e -> { 
            statues.show();              
        });
        Sights sights = new Sights();
        sights.setToolbar(tb);
        tb.addMaterialCommandToSideMenu("Αξιοθέατα", FontImage.MATERIAL_ALBUM, e -> { 
            sights.show();              
        });
       Map map  = new Map();
       map.setToolbar(tb);
       tb.addMaterialCommandToSideMenu("Χάρτης ", FontImage.MATERIAL_ALBUM, e -> { 
            map.show();              
        });

        MainSys mns = new MainSys();
        mns.setToolbar(tb);
        SplashScreen sc = new SplashScreen(); //(sights, mns);
        sc.setToolbar(tb);
        sc.show();
    }

    public void stop() {
        current = getCurrentForm();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = getCurrentForm();
        }
    }

    public void destroy() {
    }

}

НА приведенный выше код, если, например, я нажимаю на меню Форма достопримечательности, он будет отображаться нормально. Если затем я нажму на это меню, то получу пустой экран без панели инструментов меню и ничего.

любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Что на самом деле работает, так это код ниже. Я не знаю, почему это работает, потому что, как я вижу, это просто переупорядочение кода. Еще одна мысль, которую я изменил, это то, что я скачал скины новостей (Galaxy S8, ipone 8 plus) и протестировал их. Но после этого он работал на моем предыдущем скине (Samsung s7, iphone 6). Это странно, я не знаю, видит ли кто-то что-то большее.

package com.mainsys.zappeion;


import static com.codename1.ui.CN.*;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
import com.codename1.io.Log;
import com.codename1.ui.Toolbar;
import com.codename1.ui.FontImage;

/**
 * This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose 
 * of building native mobile applications using Java.
 */
public class Zappeion {

    private Form current;
    private Resources theme;

    public void init(Object context) {
        // use two network threads instead of one
        updateNetworkThreadCount(2);

        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);

        // Pro only feature
        Log.bindCrashProtection(true);

        addNetworkErrorListener(err -> {
            // prevent the event from propagating
            err.consume();
            if(err.getError() != null) {
                Log.e(err.getError());
            }
            Log.sendLogAsync();
            Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
        });        
    }

    public void start() {

        if(current != null){
            current.show();
            return;
        }        

        Statues statues = new Statues();
        Sights sights = new Sights();
        Map map  = new Map();
        MainSys mns = new MainSys();
        SplashScreen sc = new SplashScreen(sights, mns);
        BrowserForm browser = new BrowserForm();

        Toolbar tb = statues.getToolbar();

        tb.addMaterialCommandToSideMenu("Αρχική", FontImage.MATERIAL_ALBUM, e -> { 
           sc.setTitle("Αρχική");
           sc.show();              
        });
        tb.addMaterialCommandToSideMenu("Αγάλματα", FontImage.MATERIAL_ALBUM, e -> { 
             statues.setTitle("Αγάλματα");
             statues.setUrl("https://www.zappeion.gr/el/statues");
             statues.show();              
        });

        tb.addMaterialCommandToSideMenu("Αξιοθέατα", FontImage.MATERIAL_ALBUM, e -> { 
            sights.show();              
        });


       tb.addMaterialCommandToSideMenu("Χάρτης ", FontImage.MATERIAL_ALBUM, e -> { 
            map.show();              
        });

        statues.setToolbar(tb);
        sights.setToolbar(tb);
        map.setToolbar(tb);
        mns.setToolbar(tb);
        sc.setToolbar(tb);
        sc.show();
    }

    public void stop() {
        current = getCurrentForm();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = getCurrentForm();
        }
    }

    public void destroy() {
    }

}
0 голосов
/ 11 января 2019

Toolbar - это компонент, он может иметь только одного родителя, и вы добавили его в 3. Я думаю, в консоли возникло исключение, указывающее на это. Возможно, что из-за уникальной природы Toolbar исключение не было выдано.

Я бы посоветовал вам не создавать панель инструментов, а использовать form.getToolbar();, особенно потому, что ваш код уже объявлен Toolbar.setGlobalToolbar(true);.

...