将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”

Posted

技术标签:

【中文标题】将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”【英文标题】:Adding Yandex Translator to Fragment leads to "App Crashes" 【发布时间】:2018-05-02 13:12:07 【问题描述】:

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

这是片段的代码:

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;
    


【问题讨论】:

使用 LogCat 检查与您的崩溃相关的 Java 堆栈跟踪:***.com/questions/23353173/… 这里是 logcat,我不明白究竟是什么让应用程序崩溃 【参考方案1】:

请从onViewCreated() 而非onCreateView() 致电setupInteraction()。您正在尝试使用getView(),在onCreateView() 返回之前将无法使用。

【讨论】:

你能告诉我在哪里编辑,因为我不擅长编程;

以上是关于将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”的主要内容,如果未能解决你的问题,请参考以下文章

从 Yandex 翻译中获取结果

Yandex 翻译 API 安卓

如何将站点添加到托管在 Azure 中的 Yandex?

Yandex Translator Api 使用到 vb.net

Yandex-tank 将 cookie 和 Host 标头添加到来自访问日志的请求中

Yandex API 翻译器不适用于 Android 应用程序