将Yandex Translator添加到Fragment导致" App Crashes"

时间:2018-05-02 13:12:08

标签: android android-fragments translation yandex-api

我在我的应用程序中使用Yandex Translator,如果我使用Activity,它会很有用,但是当我将它添加到片段时,应用程序会在启动之前崩溃。 此外,代码中没有显示任何错误,例如一切都很好,可能是什么问题: 我在这里寻找类似的答案,但我什么都没有,在使用片段之前没有人遇到过这个问题。

以下是片段的代码:

public class FavoritesFragment extends Fragment implements TextToSpeech.OnInitListener{

private TextView header, toText, toLabel, fromLabel;
private ImageView micFrom, volFrom, volTo, reverse;
private EditText fromText;
private CircleButton convertBTN;
private CircleButton convertLayout;
private final int REQ_CODE_SPEECH_INPUT = 100;
private final int SR_CODE = 123;
private String ENGLISH_CONSTANT = "";
private String TURKISH_CONSTANT = "";

private String ENGLISH_CONVERT = "";
private String TURKISH_CONVERT = "";
private String TURKISH_CODE = "";
private String currentFrom = "";

TextToSpeech ttsEnglish, ttsTURKISH;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_favorites, container, false);

    setUpInitialConstants();
    setUpInteraction();
    setUpSpeakingListeners();
    setUpListeners();

    return v;
}


private void setUpInitialConstants() {
    ENGLISH_CONSTANT = ("ENGLISH");
    TURKISH_CONSTANT = ("TURKISH");

    ENGLISH_CONVERT = ("en") + "-" + ("tr");//"en-zh";
    TURKISH_CONVERT = ("tr") + "-" + ("en");
    //"zh-en";
    TURKISH_CODE = ("tr");
    currentFrom = ENGLISH_CONSTANT;

}

private void setUpSpeakingListeners() {
    ttsEnglish = new TextToSpeech(getContext().getApplicationContext(), new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int status) {
            // TODO Auto-generated method stub
            if (status == TextToSpeech.SUCCESS) {
                int result = ttsEnglish.setLanguage(Locale.ENGLISH);
                if (result == TextToSpeech.LANG_MISSING_DATA ||
                        result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("error", "This Language is not supported");
                } else {
                    //ConvertTextToSpeech();
                }
            } else
                Log.e("error", "Initilization Failed!");
        }
    });

    ttsTURKISH = new TextToSpeech(getContext().getApplicationContext(), new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int status) {
            // TODO Auto-generated method stub
            if (status == TextToSpeech.SUCCESS) {
                Locale locale = new Locale("tr-TR");
                int result = ttsTURKISH.setLanguage(locale);
                if (result == TextToSpeech.LANG_MISSING_DATA ||
                        result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("error", "not supported");
                } else {
                    //ConvertTextToSpeech();


                }
            } else
                Log.e("error", "Initilization Failed!");

        }
    });
}

@SuppressLint("ClickableViewAccessibility")
private void setUpListeners() {

    convertLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            callReverse();
        }
    });
    micFrom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            askSpeechInput(currentFrom);
        }
    });
    volFrom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            ConvertTextToSpeech(currentFrom, fromText.getText().toString());
        }
    });
    volTo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            String currentFromR = reverseCurrentFrom(currentFrom);
            ConvertTextToSpeech(currentFromR, toText.getText().toString());
        }
    });
    convertBTN.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            if (currentFrom.equals(ENGLISH_CONSTANT))
                translateText(fromText.getText().toString(), ENGLISH_CONVERT);
            else
                translateText(fromText.getText().toString(), TURKISH_CONVERT);
        }
    });
    toText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(200);
            if (copyToClipboard(getContext().getApplicationContext(), toText.getText().toString())) {
                if (currentFrom.equals(ENGLISH_CONSTANT)) {
                    Toast.makeText(getContext().getApplicationContext(), ("copied"), Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getContext().getApplicationContext(), (" copied successfully "), Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    fromText.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            fromText.setFocusableInTouchMode(true);

            return false;
        }
    });
}

private String reverseCurrentFrom(String currentFrom) {
    if (currentFrom.equals(ENGLISH_CONSTANT)) {
        return TURKISH_CONSTANT;
    } else return ENGLISH_CONSTANT;
}

private void callReverse() {
    if (currentFrom.equals(ENGLISH_CONSTANT)) {
        currentFrom = TURKISH_CONSTANT;
        //header.setText(getString(R.string.convertHeaderR));
        fromLabel.setText(("TURKISH"));
        fromText.setHint(("push to talk"));
        toLabel.setText(("English"));
        toText.setText(("Click translate Button to get English text"));
    } else {
        currentFrom = ENGLISH_CONSTANT;
        //header.setText(getString(R.string.convertHeader));
        fromLabel.setText(("English"));
        fromText.setHint(("Speak or type text here"));
        toLabel.setText(("TURKISH"));
        toText.setText(("click to translate"));
    }
    fromText.setText("");
    fromText.setFocusable(false);
}

private void setUpInteraction() {
    this.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);




    toText = getView().findViewById(R.id.toText);
    toLabel = getView().findViewById(R.id.toLabel);
    fromLabel = getView().findViewById(R.id.fromLabel);


    micFrom = getView().findViewById(R.id.micFrom);
    volFrom = getView().findViewById(R.id.volFrom);
    volTo = getView().findViewById(R.id.toVol);
    convertBTN = getView().findViewById(R.id.convertBTN);

    fromText = getView().findViewById(R.id.fromText);
    convertLayout = getView().findViewById(R.id.swapLanguage);

    fromText.setFocusable(false);
    currentFrom = TURKISH_CONSTANT;
    callReverse();
}

private void ConvertTextToSpeech(String lang_type, String text) {

    if (text == null || "".equals(text)) {
        if (lang_type.equals(ENGLISH_CONSTANT)) {
            text = ("Content not available");
        } else {
            text = ("something wrong !");
        }
    }
    if (lang_type.equals(ENGLISH_CONSTANT)) {
        ttsEnglish.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    } else {
        ttsTURKISH.speak(text, TextToSpeech.QUEUE_FLUSH, null);

    }

}

private void askSpeechInput(String lang_type) {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);


    if (lang_type.equals(ENGLISH_CONSTANT)) {
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Hi speak something");
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    } else {
        //Specify language
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_RESULTS, TURKISH_CODE);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, ("speak please"));
        startActivityForResult(intent, SR_CODE);

    }

}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                fromText.setText(result.get(0));
            }
            break;
        }
        case SR_CODE: {
            if (resultCode == RESULT_OK) {
                if (data != null) {
                    ArrayList<String> nBestList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    String bestResult = nBestList.get(0);
                    fromText.setText(bestResult);
                }
            }
            break;
        }

    }

    if (currentFrom.equals(ENGLISH_CONSTANT))
        translateText(fromText.getText().toString(), ENGLISH_CONVERT);
    else
        translateText(fromText.getText().toString(), TURKISH_CONVERT);

}


@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
    } else {
        Log.e("TTS", "Initialization failed");
    }
}



String text_to_return = "";

private String translateText(final String text, final String lang) {
    class getQData extends AsyncTask<String, String, String> {
        ProgressDialog loading;
        String ROOT_URL = "https://translate.yandex.net";

        Retrofit adapter = new Retrofit.Builder()
                .baseUrl(ROOT_URL)
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        APICalls api = adapter.create(APICalls.class);

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showPD();

        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

        }



        @Override
        protected String doInBackground(String... params) {
            text_to_return = "";
            String key = translator_Constants.MY_KEY;
            Call<TranslateResponse> call = api.translate(key, text, lang);
            call.enqueue(new Callback<TranslateResponse>() {
                @Override
                public void onResponse(retrofit.Response<TranslateResponse> response, Retrofit retrofit) {
                    //loading.dismiss();
                    hidePD();
                    Log.d("succ", "onResponse:code" + String.valueOf(response.code()));
                    Log.d("error mesg", String.valueOf(response.message()));
                    switch (response.code()) {
                        case 200:
                            TranslateResponse tr = response.body();
                            text_to_return = tr.getText().get(0);
                            toText.setText(text_to_return);
                            String currentFromR = reverseCurrentFrom(currentFrom);
                            ConvertTextToSpeech(currentFromR, toText.getText().toString());
                            break;
                        default:
                            if (currentFrom.equals(ENGLISH_CONSTANT))
                                Toast.makeText(getContext().getApplicationContext(), ("Please Try Again"), Toast.LENGTH_SHORT).show();
                            else
                                Toast.makeText(getContext().getApplicationContext(), ("again"), Toast.LENGTH_SHORT).show();
                            break;
                    }
                }

                @Override
                public void onFailure(Throwable t) {
                    pd.dismiss();
                    Log.d("retro error", t.getMessage());
                    if (currentFrom.equals(ENGLISH_CONSTANT))
                        Toast.makeText(getContext().getApplicationContext(), ("Failed to Convert!Check Internet Connection"), Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(getContext().getApplicationContext(), ("no connexion"), Toast.LENGTH_SHORT).show();


                }
            });

            return text_to_return;
        }
    }

    getQData ru = new getQData();
    try {
        ru.execute().get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return text_to_return;
}

ProgressDialog pd;

private void showPD() {
    pd = new ProgressDialog(getActivity());
    if (currentFrom.equals(ENGLISH_CONSTANT)) {
        pd.setMessage(("Patience, We are translating…"));
    } else {
        pd.setMessage(("translating ..."));
    }
    pd.show();
}

private void hidePD() {

    pd.dismiss();
}

public boolean copyToClipboard(Context context, String text) {
    try {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                    .getSystemService(CLIPBOARD_SERVICE);
            clipboard.setText(text);
        } else {
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context
                    .getSystemService(CLIPBOARD_SERVICE);
            android.content.ClipData clip = android.content.ClipData
                    .newPlainText("copy", text);
            clipboard.setPrimaryClip(clip);
        }
        return true;
    } catch (Exception e) {
        return false;
    }
}
}

1 个答案:

答案 0 :(得分:0)

setupInteraction()致电onViewCreated(),而不是onCreateView()。您正在尝试使用getView(),这将在onCreateView()返回后无效。