片段在尝试从活动接收对象时崩溃
美好的一天,
我有一个问题,我的活动正在进行网络调用,当网络调用完成时,它使用从调用接收到的JSON对象中的数据对活动进行一些更改,然后将对象传递给同样的活动。 这些片段位于TabLayout中。
我遇到的问题是,如果我放入System.out.println(),它会打印出正确的数据。 我想要设置的那一刻说一个TextView与我在Fragment中收到的数据应用程序崩溃与Nullpointer。 当我使用Android工作室中的Debug调试它时,由于某种原因,TextView I设置始终为null。
执行初始网络呼叫的活动代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listings); ButterKnife.bind(this); setSupportActionBar(toolbar); handleIntent(getIntent()); } private void handleIntent(Intent aIntent) { if (aIntent != null) { String tradeType = aIntent.getStringExtra("itemType"); String tradeId = aIntent.getStringExtra("itemId"); presenter = new ItemPresenterImpl(this, ItemBuyNowActivity.this); presenter.doListingServiceCall(tradeId); // <------- This is the where I send the Trade Id so I can do the network call. } else { System.out.println("Intent is null in " + ItemBuyNowActivity.class.getSimpleName()); } }
Activity和Presenter之间的接口:
public interface ItemPresenter { void doListingServiceCall(String itemId); //<------- Comes to this Interface void doToolbarBackgroundImageCall(TradeItem aTradeItem); }
实现Presenter的类:
@Override public void doListingServiceCall(String aItemId) { // <------- This is where the network call starts String homeURL = BobeApplication.getInstance().getWsURL() + mContext.getString(R.string.ws_url_item) + aItemId; BobeJSONRequest jsObjRequest = new BobeJSONRequest(Request.Method.GET, homeURL, null, this, this); VolleySingleton.getInstance().addToRequestQueue(jsObjRequest, "ListingRequest"); } @Override public void doToolbarBackgroundImageCall(TradeItem aTradeItem) { ImageRequest request = new ImageRequest(aTradeItem.getItem().getImageUrl(), new Response.Listener() { @Override public void onResponse(Bitmap bitmap) { Drawable drawable = new BitmapDrawable(mContext.getResources(), bitmap); mItemView.loadBackgroundImage(drawable); } }, 0, 0, null, new Response.ErrorListener() { public void onErrorResponse(VolleyError error) { mItemView.displayErrorMessage(VolleyErrorHelper.getErrorType(error, mContext) + " occurred downloading background image"); } }); VolleySingleton.getInstance().addToRequestQueue(request, "ListItemToolbarBackgroundImageRequest"); } @Override public void onResponse(Object response) { Gson gson = new Gson(); TradeItem tradeItem = gson.fromJson(response.toString(), TradeItem.class); mItemView.populateListViews(tradeItem); // <------- This is the where I send the Object so the views in the activity can be manipulated doToolbarBackgroundImageCall(tradeItem); }
处理的Activity中的方法
@Override public void populateListViews(TradeItem aTradeItem) { mOverviewPresenter = new OverviewPresenterImpl(new OverviewListItemFragment(), aTradeItem); OverviewListItemFragment.setData(aTradeItem); //<------- This is the where I send the Object to the fragment so i can manipulate the views in the fragment }
接收数据的片段:
public class OverviewListItemFragment extends Fragment implements OverviewView { private static TextView mOverViewHeading; public OverviewListItemFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mOverViewHeading = (TextView) getActivity().findViewById(R.id.frag_overview_heading_textview); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.overview_list_item_fragment, container, false); } @Override public void populateOverviewViews(final TradeItem aTradeItem) { System.out.println("Overview Trade Object title is:" + aTradeItem.getItem().getTradeTitle()); // <------- This is print statement works 100% but when I try setting mOverViewHeading to the text in aTradeItem.getItem().getTradeTitle() I get a Null pointer Exception. } public static void setData(TradeItem aTradeItem) { System.out.println("Overview Trade Object title is:" + aTradeItem.getItem().getTradeTitle()); // <------- This is print statement works 100% but when I try setting mOverViewHeading to the text in aTradeItem.getItem().getTradeTitle() I get a Null pointer Exception. mOverViewHeading.setText(aTradeItem.getItem().getTradeTitle());// <------- This is where it crashes and mOverViewHeading is still null at this point. } }
编辑:对不起,我忘记了LogCat:
02-05 17:08:21.554 30512-30512/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.example.app.ui.fragments.OverviewListItemFragment.setData(OverviewListItemFragment.java:46) at com.example.app.ui.activities.ItemBuyNowActivity.populateListViews(ItemBuyNowActivity.java:95) at com.example.app.listing.ItemPresenterImpl.onResponse(ItemPresenterImpl.java:62) at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)
我的想法是,我试图设置的视图在接收数据时不是“活动”(如果这是正确的词),因为当我在接收数据的方法上运行带有断点的调试器时在Fragment中,mOverViewHeading TextView id为null,即使我在onCreate中有findViewById,也尝试将它放在onCreateView()中,但两次都失败了。 我还尝试将findViewById置于响应成功但在我尝试在TextView上设置setText()之前调用的相同方法中。
谢谢
你不能在片段onCreate()中调用findViewById。 那时没有UI。 尝试在onCreateView()中调用findViewById。 此外,您必须在View内部片段上使用findViewById()。 你不能使用Activity。
喜欢这个 :
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.overview_list_item_fragment, container, false); mOverViewHeading = (TextView) view.findViewById(R.id.frag_overview_heading_textview); return view; }
- Android – Fragment内部的RecyclerView – NullPointerException
- 单个socket.IO连接android中的所有活动
- IllegalArgumentException:文件包含路径分隔符Android
- Androidexception(不可信服务器证书):https带有服务器身份validation的XML请求
- 通过套接字编程将png图像文件从服务器(桌面)发送到客户端(android)
- 如何在单击按钮后使用不可见属性“可见”创建视图
- Android蓝牙串口RFCOMM低波特率/慢速传输
- 在Playstore android上更新app时,设备支持删除了警告
- onPictureTaken()出错,问题是无法将RGB转换为GRAY,程序停止从cvtcolor()函数运行。