Когда я нажимаю на фрагмент, ничего не происходит, хотя я добавил слушателя - PullRequest
0 голосов
/ 08 мая 2020

Мы разрабатываем приложение AR Android, которое развертывает модель на прессованной плоскости. Мы пробовали использовать шаблон MVC, это наш код. Стадия проектирования была довольно сложной, и мы новички, поэтому я буду признателен за ваш совет.

Наша модель

public class ARModels {
    //properties
    private StorageReference modelRef;
    private Context context;

    //constructors
    public ARModels( String name , Context context){
        this.context = context;
        FirebaseApp.initializeApp(context);
        FirebaseStorage storage = FirebaseStorage.getInstance();
        name = name.toLowerCase();
        modelRef  = storage.getReference().child(name + ".glb");
        getModel(name);

    }

    //methods
    private void getModel(String s){
        try {
            File file = File.createTempFile( s , "glb");
            modelRef.getFile(file).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                    buildModel(file);
                }
            });
        } catch (IOException e){
            e.printStackTrace();
        }
    }


    public ModelRenderable renderable;

    private void buildModel(File file) {

        RenderableSource renderableSource = RenderableSource
                .builder()
                .setSource(context, Uri.parse(file.getPath()), RenderableSource.SourceType.GLB)
                .setRecenterMode(RenderableSource.RecenterMode.ROOT)
                .build();

        ModelRenderable
                .builder()
                .setSource( context, renderableSource)
                .setRegistryId(file.getPath())
                .build()
                .thenAccept(modelRenderable -> {
                    renderable = modelRenderable;
                });

    }

Наш класс представления

public class ARScreen extends AppCompatActivity {

    //properties
    private ArFragment arFragment;
    private ARScreenController controller;
    private String s;
    private ARModels models;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a_r_screen);

        s = getIntent().getExtras().getString("ModelName");
        models = new ARModels(s, this);
        arFragment = (ArFragment) getSupportFragmentManager().findFragmentById( R.id.arFragment);
        controller = new ARScreenController( arFragment, this, s);
        assert arFragment != null;

        arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
            AnchorNode anchor = new AnchorNode(hitResult.createAnchor());
            anchor.setRenderable(models.renderable);
            controller.InsertModel(s, arFragment, anchor);
        });
    }
}

Наш контроллер

public class ARScreenController {
    //properties
    private ArFragment arFragment;
    private Context context;
    private ARModels models;

    //constructors
    public ARScreenController(ArFragment fragment, Context context, String s){
        arFragment = fragment;
        this.context = context;
        models = new ARModels(s, this.context);
    }

    //methods
    public void InsertModel(String s, ArFragment arFragment, AnchorNode node){
        /*
        arFragment = (ArFragment) ((AppCompatActivity)context).getSupportFragmentManager().findFragmentById( R.id.arFragment);
        assert arFragment != null;
            arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
                AnchorNode anchor = new AnchorNode(hitResult.createAnchor());
         */
                //models.getModel(s);
        ModelRenderable
                .builder()
                .build()
                .thenAccept(modelRenderable -> {
                    node.setRenderable(models.renderable);
                    arFragment.getArSceneView().getScene().addChild(node);
                });

    }
}

То, что я сделал здесь, это то, что я получил текст кнопки, нажатой на предыдущем действии в моем классе View, который для тестовых целей это текст «мозг». У меня есть файл brain.glb в моем хранилище firebase, а остальное - для загрузки модели из firebase в нашу модель и развертывания ее во фрагменте в нашем классе контроллера. Что происходит в моем случае: я открываю экран AR, я нашел самолет, но ничего не происходит, когда я нажимаю на него. Я не уверен, что для этого тоже есть ошибка c (?), В logcat написано

Невозможно загрузить Renderable registryId = 'null' java .lang.AssertionError: ModelRenderable должен иметь исходный код.

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

...