【问题标题】:getApplicationContext() error AndroidgetApplicationContext() 错误 Android
【发布时间】:2015-02-17 13:24:44
【问题描述】:

我有一个片段,它允许用户输入消息和将发送消息的电话号码。我收到一个错误“无法解析方法 getApplicationContext()”我在这里查看了答案the method getApplicationContext() is undefined 但它对我没有帮助,也许我执行错了但我不确定!这段代码作为 Activity 可以正常工作,但不能作为片段。

FragmentTab1 类

package com.androidbegin.absfragtabhost;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.app.Fragment;
import android.app.Activity;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class FragmentTab3 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragmenttab3, container, false);
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);

    sendBtn = (Button) rootView.findViewById(R.id.btnSendSMS);
    txtphoneNo = (EditText) rootView.findViewById(R.id.editTextPhoneNo);
    txtMessage = (EditText) rootView.findViewById(R.id.editTextSMS);

    sendBtn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            sendSMSMessage();
        }
    });

    return rootView;
}



    Button sendBtn;
    EditText txtphoneNo;
    EditText txtMessage;



    protected void sendSMSMessage() {
        Log.i("Send SMS", "");

        String phoneNo = txtphoneNo.getText().toString();
        String message = txtMessage.getText().toString();

        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNo, null, message, null, null);
            Toast.makeText(getApplicationContext(), "SMS sent.",
                    Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(),
                    "SMS failed, please try again.",
                    Toast.LENGTH_LONG).show();
            e.printStackTrace();


        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }


}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    Fragment中不存在getApplicationContext()方法。但是,它确实存在于类Activity 中,因此您可以使用getActivity().getApplicationContext() 从片段对象中获取上下文。 (假设片段附加到一个活动,所以getActivity() 将返回一个非空对象,这通常是正确的)

    【讨论】:

      【解决方案2】:

      使用getActivity().getApplicationContext();

      【讨论】:

        【解决方案3】:

        您必须在非活动类上创建一个构造函数,该构造函数接受参数的上下文,并且在您的活动类上,您必须在对象声明时传递上下文,如下所示:

        //ON non activity class :
        public class longcomputingtask extends AsyncTask<Void,Integer,Void> {
        
            private  Context context ;
        
            public longcomputingtask()
            {
            }
        
            public longcomputingtask(Context context)
            {
                this.context=context;
            }
        
        //   on activity class :
        
        public Context context;
        context=getApplication().getBaseContext();
        
        longcomputingtask calcul =new longcomputingtask(context):
        

        【讨论】:

          【解决方案4】:

          getApplicationContext() 不存在,或者您可以说未在 Fragment 类中定义,这意味着您无法直接在 Fragment 类中访问它。

          所以解决方案是而不是这样做

          Toast.makeText(getApplicationContext(), "SMS sent.",Toast.LENGTH_LONG).show();
          

          您应该使用getActivity() 方法,如下所示

          Toast.makeText(getActivity().getApplicationContext(), "SMS sent.",Toast.LENGTH_LONG).show();
          

          希望对你有帮助。

          【讨论】:

            【解决方案5】:

            您应该使用片段活动中可用的应用程序上下文

            getActivity().getApplicationContext();
            

            您不应在此处使用getActivity() 作为上下文,因为Toast 的寿命可能比显示它的活动长(按下主页按钮,已启动另一个活动等)

            http://developer.android.com/guide/topics/ui/notifiers/toasts.html#Basics

            【讨论】:

              【解决方案6】:

              也许 getActivity() 就足够了,因为 Activity 扩展了 Context。

              无论如何,请考虑是否需要Context with the lifecycle separated from you Activity's Context 来了解您是需要使用 getActivity().getApplicationContext() 还是只使用 getActivity()。

              请参阅this thread 了解更多信息。

              【讨论】:

                【解决方案7】:

                在此处查看答案:using context in fragment

                只需调用getActivity(),确保它不为空,然后调用getApplicationContext()

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-02-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-04-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-03-28
                  相关资源
                  最近更新 更多