簡體   English   中英

如何從一個片段移動到另一個片段

[英]How to move from one fragment to another

我目前有一個包含多個片段的程序,我想要主頁片段中的一個按鈕將我帶到第二個片段。 我不知道該怎么做。 我將包含我的 HomeFragment 的代碼

HomeFragment.java

package com.mvsolutions.snap.ui.home;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.ml.vision.FirebaseVision;
import com.google.firebase.ml.vision.common.FirebaseVisionImage;
import com.google.firebase.ml.vision.text.FirebaseVisionText;
import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector;
import com.mvsolutions.snap.R;
import com.mvsolutions.snap.ui.display.DisplayFragment;

import java.util.List;
import java.util.zip.Inflater;

import static android.app.Activity.RESULT_OK;

public class HomeFragment extends Fragment {


    private HomeViewModel homeViewModel;

    private ImageView imageView;
    private Button captureImageButton, detectButton, pickButton;
    private Bitmap imageBitmap;
    private TextView capturedTextView;
    static final int REQUEST_IMAGE_CAPTURE = 1;
    private static final int RESULT_LOAD_IMAGE = 101;

    public View onCreateView(@NonNull final LayoutInflater inflater,
                             final ViewGroup container, Bundle savedInstanceState) {
        homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        //View v = inflater.inflate(R.layout.fragment_display, container, false);
        imageView = root.findViewById(R.id.home_image_view_img);
        capturedTextView = root.findViewById(R.id.home_text_view_txt);
        captureImageButton = root.findViewById(R.id.capture_image_btn);
        detectButton = root.findViewById(R.id.detect_text_btn);
        pickButton = root.findViewById(R.id.pick_image_btn);



        captureImageButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                captureImage();
            }
        });
        pickButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pickImage();
            }
        });
        detectButton.setOnClickListener(new View.OnClickListener() {
            @Override
*********************************************************************************************
            public void onClick(View v) {
                DisplayFragment displayFragment = new DisplayFragment();
                FragmentManager fragmentManager =  getFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.DisplayFragment, displayFragment, displayFragment.getTag()).commit();
*********************************************************************************************
                detectTextFromImage();
            }
        });
        return root;
    }

    private void detectTextFromImage() {
        capturedTextView.setText("");
        FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromBitmap(imageBitmap);
        FirebaseVisionTextDetector visionTextDetector = FirebaseVision.getInstance().getVisionTextDetector();
        visionTextDetector.detectInImage(firebaseVisionImage).addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
            @Override
            public void onSuccess(FirebaseVisionText firebaseVisionText) {
                List<FirebaseVisionText.Block> textBlocks = firebaseVisionText.getBlocks();
                if (textBlocks.size() == 0) {
                    Toast.makeText(getContext(), "No Text Found", Toast.LENGTH_SHORT).show();
                } else {
                    for (FirebaseVisionText.Block block : textBlocks) {
                        String text = block.getText();
                        capturedTextView.setText(capturedTextView.getText() + " " + text);
                    }
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
                Log.d("Error", e.getMessage());
            }
        });
    }

    private void pickImage() {
        Intent i = new Intent(
                Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, RESULT_LOAD_IMAGE);
    }

    private void captureImage() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            imageBitmap = (Bitmap) extras.get("data");
            imageView.setImageBitmap(imageBitmap);
        }
        else if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            Uri imageUri = data.getData();
            imageView.setImageURI(imageUri);
        }
    }
}

在兩行星號之間,我試圖編寫一些代碼使按鈕將我帶到第二個片段。 如果有人可以修復此代碼,或為我提供新的解決方案來回答我的問題,將不勝感激。

我忘記在我的代碼中添加一個提交語句,但即使這樣它仍然會崩潰。 這是錯誤消息:

2020-08-01 13:55:23.904 22878-22878/com.mvsolutions.snap E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mvsolutions.snap, PID: 22878
    java.lang.NullPointerException: null reference
        at com.google.android.gms.common.internal.Preconditions.checkNotNull(Unknown Source:7)
        at com.google.firebase.ml.vision.common.FirebaseVisionImage.<init>(Unknown Source:3)
        at com.google.firebase.ml.vision.common.FirebaseVisionImage.fromBitmap(Unknown Source:2)
        at com.mvsolutions.snap.ui.home.HomeFragment.detectTextFromImage(HomeFragment.java:94)
        at com.mvsolutions.snap.ui.home.HomeFragment.access$200(HomeFragment.java:40)
        at com.mvsolutions.snap.ui.home.HomeFragment$3.onClick(HomeFragment.java:86)
        at android.view.View.performClick(View.java:7870)
        at android.widget.TextView.performClick(TextView.java:14966)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29315)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7777)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)
2020-08-01 13:55:23.923 22878-22878/com.mvsolutions.snap I/Process: Sending signal. PID: 22878 SIG: 9

您缺少對FragmentTransaction.commit()的調用。

*********************************************************************************************
public void onClick(View v) {
    DisplayFragment displayFragment = new DisplayFragment();
    FragmentManager fragmentManager =  getFragmentManager();
    fragmentManager.beginTransaction()
                    .replace(R.id.DisplayFragment, displayFragment, displayFragment.getTag())
                    .commit() // <- HELLO!;
*********************************************************************************************

編輯:好吧,現在你只是在問一個全新的問題,但是沒關系。

您的錯誤消息非常明確:您在第 94 行調用detectTextFromImage中的HomeFragment時將 null 傳遞給FirebaseVisionImage.fromBitmap

java.lang.NullPointerException: null reference
    at com.google.android.gms.common.internal.Preconditions.checkNotNull(Unknown Source:7)
    at com.google.firebase.ml.vision.common.FirebaseVisionImage.<init>(Unknown Source:3)
    at com.google.firebase.ml.vision.common.FirebaseVisionImage.fromBitmap(Unknown Source:2)
    at com.mvsolutions.snap.ui.home.HomeFragment.detectTextFromImage(HomeFragment.java:94)

從你的代碼我猜它是imageBitmap所以你應該從那里開始。 使用您的調試器確定為什么是 null,然后修復您的邏輯,使其不是 null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM