我需要在toast消息中获取片段上下文,
我试过了getActivity()
和getActivity().getApplicationContext()
以及HomeFragment.class
和HomeFragment.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);
}
}
答案 0 :(得分:0)
/**
* Return the Activity this fragment is currently associated with.
*/
final public Activity getActivity() {
return mActivity;
}
在onAttach(活动活动)生命周期方法回调后必须使用getActivity()
答案 1 :(得分:0)
保存对Activty
中onAttatch()
的引用并使用:
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
}
这也很有效:
如果片段当前已添加到其活动中,则返回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