getApplicationContext()错误Android

时间:2015-02-17 13:24:44

标签: android android-fragments

我有一个片段,允许用户输入消息和电话号码,消息将被传递到该消息。我收到一个错误“无法解决方法getApplicationContext()”我在这里查看答案the method getApplicationContext() is undefined但它没有帮助我,也许我实现它错了但我不确定!此代码可以作为活动使用,但不能作为片段。

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;
    }


}

7 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:5)

使用getActivity().getApplicationContext();

答案 2 :(得分:1)

您应该使用片段活动

中提供的应用程序上下文
getActivity().getApplicationContext();

您不应该在此处使用getActivity()作为上下文,因为Toast可以比显示它的活动更长时间(按下主页按钮,已启动其他活动等)

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

答案 3 :(得分:1)

使用getActivity()可能已经足够了,因为Activity扩展了Context。

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

有关详细信息,请参阅this thread

答案 4 :(得分:1)

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

package.json

答案 5 :(得分:0)

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

只需致电getActivity(),确保其不为空,并在其上致电getApplicationContext()

答案 6 :(得分:0)

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

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

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

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

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

我希望它有所帮助。