Android - 无法在Toast消息中获取片段上下文

时间:2015-08-07 06:00:49

标签: android android-fragments

我需要在toast消息中获取片段上下文, 我试过了getActivity()getActivity().getApplicationContext() 以及HomeFragment.classHomeFragment.this,以及this

我还尝试创建一个全局变量来获取上下文并将其传递给toast,但它没有工作没有任何工作。这是我的片段类

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonObjectRequest;

import net.cairobus.app.activities.ActivityMain;
import net.cairobus.app.app.AppController;
import net.cairobus.app.materialtest.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class HomeFragment extends Fragment {


    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;
    private OnFragmentInteractionListener mListener;

    private String urlCitiesObj = "url";
    private static String TAG = HomeFragment.class.getSimpleName();
    private TextView txtResponse;
    private String jsonResponse;
    //private Context globalContext = null;
    private Context globalContext = getActivity().getApplicationContext();



    public static HomeFragment newInstance(String param1, String param2) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    public HomeFragment() {
        // Required empty public constructor
    }



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);



    }


    // TODO: Rename method, update argument and hook method into UI event

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

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

        makeJsonArrayRequest();
        txtResponse = (TextView) layout.findViewById(R.id.txtResponse);


        return layout;
    }

    private Activity mActivity;

    @Override
    public void onAttach(Activity activity) {

    }





    private void makeJsonArrayRequest() {

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                urlCitiesObj, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());


                try {
                    JSONArray jsonArray = response.getJSONArray("GetCitiesResult");
                    for (int i = 0; i < jsonArray .length(); i++) {

                        JSONObject jSONObject = jsonArray .getJSONObject(i);
                        String cityID = jSONObject .getString("CityID");
                        String cityName = jSONObject .getString("CityName");

                        jsonResponse += "CityID: " + cityID  + "\n\n";
                        jsonResponse += "CityName: " + cityName  + "\n\n";

                        txtResponse.setText(jsonResponse);

                    }

                    if( isAdded()){
                        getActivity().getApplicationContext()
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(mActivity, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }



            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
                // hide the progress dialog

            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq);
    }






    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }


    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }


}

3 个答案:

答案 0 :(得分:0)

/**
 * Return the Activity this fragment is currently associated with.
 */
final public Activity getActivity() {
    return mActivity;
}

在onAttach(活动活动)生命周期方法回调后必须使用getActivity()

答案 1 :(得分:0)

保存对ActivtyonAttatch()的引用并使用:

private Activity mActivity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = activity;
}
如果片段与getActivity()(尚未)相关联,

null将返回Activity

出于同样的原因,以下行不起作用。

private Context globalContext = getActivity().getApplicationContext();

因为此时Fragment未与Activity相关联。

<强>增加:

如果你看一下片段的源代码:

public void onAttach(Activity activity) {
    mCalled = true;
}

final public FragmentActivity getActivity() {
    return mActivity;
}

请注意,mActivity 已分配onAttach()

替代解决方案:

检查:

if( getActivity() == null){
    // not assigent to an Activity
}

这也很有效:

isAdded()

  

如果片段当前已添加到其活动中,则返回true。

if( isAdded()){
    getActivity() // will not return null
}

除了无法解决构造函数问题:

尝试改变:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            urlCitiesObj, null, new Response.Listener<JSONObject>() {

JSONObject obj = null;
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            urlCitiesObj, obj, new Response.Listener<JSONObject>() {

 JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
        urlCitiesObj, (String)null, new Response.Listener<JSONObject>() {

答案 2 :(得分:0)

每当您在用户界面上执行任何操作时,都必须注意从$PDOArray开始执行此操作。

变化:

1)Inner class,
2)Static nested classes
3)Method local inner classes
4)Anonymous inner classes

为:

public void initAudioImageIcon(boolean initLoad) {
    boolean isAudioHeaderMode = IMSharedPreferences.getBooleanExtra(this, IMSPConstant.SP_NAME_MESSAGE,
            IMSPConstant.SP_KEY_AUDIO_HEADER_MODE);


    if (isAudioHeaderMode) {
        mAudioHanderMode.setVisibility(View.VISIBLE);
        // audioManager.setMode(AudioManager.MODE_IN_CALL) , but android system 5.0+ no any change, getMode() == AudioManager.MODE_NORMAL
        setAudioMode(AudioManager.MODE_IN_CALL);
        audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
        if (!initLoad) {
            showAudioModePrompt(this.getText(R.string.im_audio_in_call), 1000);
        }
    } else {
        mAudioHanderMode.setVisibility(View.GONE);
        setAudioMode(AudioManager.MODE_NORMAL);
        if (!initLoad) {
            showAudioModePrompt(this.getText(R.string.im_audio_in_speeker), 1000);
        }
    }
}

UI thread

的相同修改