最近很多小伙伴都在问使用CustomListAdapter时发生NullPointerException和addeventlistenerofnull这两个问题,那么本篇文章就来给大家详细解答一下,同
最近很多小伙伴都在问使用CustomListAdapter时发生NullPointerException和addeventlistener of null这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展android studio NullPointerException at addDrawerListener 方法、android – 为什么使用标准BillingService会发生NullPointerException?、android – 自定义SimpleCursorAdapter,数据库查询和NullPointerException、Android中的Spinner和ArrayAdapter NullPointerException等相关知识,下面开始了哦!
本文目录一览:- 使用CustomListAdapter时发生NullPointerException(addeventlistener of null)
- android studio NullPointerException at addDrawerListener 方法
- android – 为什么使用标准BillingService会发生NullPointerException?
- android – 自定义SimpleCursorAdapter,数据库查询和NullPointerException
- Android中的Spinner和ArrayAdapter NullPointerException
使用CustomListAdapter时发生NullPointerException(addeventlistener of null)
我在Android
Appiclation中创建CustomListAdapter。但是我NullPointerException
在执行它时得到这个错误。
这是我的CustomListAdapter.java代码:
/**
*
*/
package com.fanjavaid.searchhttprequest.adapter;
import java.util.List;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.fanjavaid.searchhttprequest.R;
import com.fanjavaid.searchhttprequest.app.AppController;
import com.fanjavaid.searchhttprequest.model.Menu;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
* @author fanjavaid
*
*/
public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Menu> menuItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public CustomListAdapter(Activity activity,List<Menu> menuItems) {
this.activity = activity;
this.menuItems = menuItems;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return menuItems.size();
}
@Override
public Object getItem(int location) {
// TODO Auto-generated method stub
return menuItems.get(location);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.list_row,null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail);
TextView menuTitle = (TextView) convertView.findViewById(R.id.menuTitle);
TextView inputDate = (TextView) convertView.findViewById(R.id.postDate);
// Getting movie data for the row
Menu m = menuItems.get(position);
// thumbnail image
thumbNail.setImageUrl(m.getThumbnailUrl(),imageLoader);
// title
menuTitle.setText(m.getMenuTitle());
// input date
inputDate.setText("Post Date : " + String.valueOf(m.getInputDate().toString()));
return convertView;
}
}
这是我的活动代码:
package com.fanjavaid.searchhttprequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.fanjavaid.searchhttprequest.adapter.CustomListAdapter;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
public class ListMenuActivity extends Activity {
// Log tag
private static final String TAG = ListMenuActivity.class.getSimpleName();
// Movie JSON Url
private List<com.fanjavaid.searchhttprequest.model.Menu> menuList = new ArrayList<com.fanjavaid.searchhttprequest.model.Menu>();
private ListView listView;
private CustomListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_menu);
listView = (ListView) findViewById(R.id.list);
adapter = new CustomListAdapter(this,menuList);
listView.setAdapter(adapter);
Intent intent = getIntent();
//String jsonData = intent.getStringExtra("json_menu");
Bundle bundle = intent.getExtras();
String jsonString = bundle.getString("json_menu");
try {
JSONObject objectJson = new JSONObject(jsonString);
JSONArray arrayJson = objectJson.getJSONArray("results");
for (int i = 0; i < arrayJson.length(); i++) {
JSONObject obj = arrayJson.getJSONObject(i);
com.fanjavaid.searchhttprequest.model.Menu menu = new com.fanjavaid.searchhttprequest.model.Menu();
menu.setMenuTitle(obj.getString("nama_menu"));
menu.setThumbnailUrl("http://tempercube/receip_finder/" + obj.getString("gambar"));
String dateInString = obj.getString("tgl_input");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date parsedDate = formatter.parse(dateInString);
menu.setInputDate(parsedDate);
// add to list
menuList.add(menu);
}
// notifying list adapter about data changed
// so that it renders the list view with data changed
adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
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.list_menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button,so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
在我的活动中,已经在setAdapter()方法之前添加了CustomListAdapter实例化。但是我仍然得到那个NullPointerException
错误。
这是我的错误日志
09-18 09:11:34.661: E/AndroidRuntime(24097): FATAL EXCEPTION: main
09-18 09:11:34.661: E/AndroidRuntime(24097): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fanjavaid.searchhttprequest/com.fanjavaid.searchhttprequest.ListMenuActivity}: java.lang.NullPointerException
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread.access$600(ActivityThread.java:149)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.os.Looper.loop(Looper.java:137)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread.main(ActivityThread.java:5214)
09-18 09:11:34.661: E/AndroidRuntime(24097): at java.lang.reflect.Method.invokeNative(Native Method)
09-18 09:11:34.661: E/AndroidRuntime(24097): at java.lang.reflect.Method.invoke(Method.java:525)
09-18 09:11:34.661: E/AndroidRuntime(24097): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
09-18 09:11:34.661: E/AndroidRuntime(24097): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
09-18 09:11:34.661: E/AndroidRuntime(24097): at dalvik.system.NativeStart.main(Native Method)
09-18 09:11:34.661: E/AndroidRuntime(24097): Caused by: java.lang.NullPointerException
09-18 09:11:34.661: E/AndroidRuntime(24097): at com.fanjavaid.searchhttprequest.adapter.CustomListAdapter.<init>(CustomListAdapter.java:34)
09-18 09:11:34.661: E/AndroidRuntime(24097): at com.fanjavaid.searchhttprequest.ListMenuActivity.onCreate(ListMenuActivity.java:38)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.Activity.performCreate(Activity.java:5133)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-18 09:11:34.661: E/AndroidRuntime(24097): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
09-18 09:11:34.661: E/AndroidRuntime(24097): ... 11 more
这是我的AppController.java
/**
*
*/
package com.fanjavaid.searchhttprequest.app;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import com.fanjavaid.searchhttprequest.util.LruBitmapCache;
import android.app.Application;
import android.text.TextUtils;
/**
* @author fanjavaid
*
*/
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
mImageLoader = new ImageLoader(this.mRequestQueue,new LruBitmapCache());
}
return this.mImageLoader;
}
public <T> void addToRequestQueue(Request<T> req,String tag) {
// set the default tag if tag is empty
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
这是我的MainActivity.java
package com.fanjavaid.searchhttprequest;
import java.util.LinkedList;
import java.util.List;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView responseText;
private EditText searchText;
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseText = (TextView) findViewById(R.id.textView1);
searchText = (EditText) findViewById(R.id.searchBox);
url = "http://tempercube.com/receip_finder/process_cari.php";
}
private String addLocationToUrl(String url,String parameter) {
if (!url.endsWith("?"))
url += "?";
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("bahan",parameter));
String paramString = URLEncodedUtils.format(params,"utf-8");
url += paramString;
return url;
}
public void doRequest(String passUrl) {
final ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonObjectRequest jsonObjRequest = new JsonObjectRequest(Method.GET,passUrl,null,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
Log.d("TAG",response.toString());
responseText.setText(response.toString());
Intent intent = new Intent("com.fanjavaid.searchhttprequest.ListMenuActivity");
Bundle extras = new Bundle();
extras.putString("json_menu",response.toString());
intent.putExtras(extras);
startActivity(intent);
pDialog.hide();
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.d("ERROR","Error : " + error.getMessage());
pDialog.hide();
}
});
// Make request queue
VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsonObjRequest);
}
public void searchMenu(View view) {
if(view.getId() == R.id.button1){
String paramSearch = searchText.getText().toString();
url = addLocationToUrl(url,paramSearch);
Log.d("URL_INFO",url);
doRequest(url);
// reset URL
url = "http://tempercube.com/receip_finder/process_cari.php";
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main,so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
最后是我的list_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_row_selector">
</ListView>
</RelativeLayout>
请帮忙。非常感谢你。
android studio NullPointerException at addDrawerListener 方法
如何解决android studio NullPointerException at addDrawerListener 方法?
我正在尝试构建一个包含少量项目的导航抽屉。但它让我在下面的代码中的 addDrawerListener 方法出错:
public class MainActivity extends AppCompatActivity {
private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
}
@Override
public void onBackpressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else{
super.onBackpressed();
}
}
}
这里是 AndroidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity android:name=".MainActivity"
android:theme="@style/Theme.MyApplication.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是菜单 ( drawer_menu.xml
),它似乎工作正常
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn = "navigation_view">
<group android:checkableBehavior="single">
<item android:id="@+id/nav_people"
android:icon="@drawable/ic_people"
android:title="@string/people" />
<item android:id="@+id/nav_goods"
android:icon="@drawable/ic_goods"
android:title="@string/goods" />
<item android:id="@+id/nav_delivery"
android:icon="@drawable/ic_delivery"
android:title="@string/delivery" />
<item android:id="@+id/nav_saloon"
android:icon="@drawable/ic_saloon"
android:title="@string/saloon" />
<item android:id="@+id/nav_setting"
android:icon="@drawable/ic_setting"
android:title="@string/setting" />
<item android:id="@+id/nav_help"
android:icon="@drawable/ic_help"
android:title="@string/help" />
<item android:id="@+id/nav_update"
android:icon="@drawable/ic_update"
android:title="@string/update" />
<item android:id="@+id/nav_about_us"
android:icon="@drawable/ic_about_us"
android:title="@string/about_us" />
<item android:id="@+id/nav_quit"
android:icon="@drawable/ic_exit"
android:title="@string/exit" />
</group>
</menu>
还有一个标题( nav_header.xml
),其中包含一张小图片和两个文本视图
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/nav_header"
android:gravity="bottom"
android:orientation="vertical"
android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher_round" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:text="@string/strong_text"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/weak_text" />
</LinearLayout>
这里是 themes.xml
文件。我试图遵循的教程有点过时,并且有styles.xml 文件而不是themes.xml 但我不确定。我复制粘贴 <style name="Theme.MyApplication.NoActionBar">
themes.xml (night)
部分
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="Theme.MyApplication.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
解决方法
drawer 使用前需要初始化。
drawer = findViewById(R.id.drawer)
(注意:在 param 中,您需要像 Toolbar 一样从 xml 传递 DrawerLayout 的 id)。
这应该在你使用 drawer 之前,在你的案例下面的行之前。
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
,
您必须像使用工具栏一样绑定 drawerLayout id。
在使用“抽屉”对象之前,只需在 XML 中绑定抽屉的 id。
,在查找工具栏 id 下添加以下行 -
int
android – 为什么使用标准BillingService会发生NullPointerException?
我在我的应用程序中使用标准BillingService(即从sample application复制而不做更改).
但有时我的应用程序崩溃与logcat中的以下数据:
04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003}
04-16 10:05:43.646: DEBUG/AndroidRuntime(28748): Shutting down VM
04-16 10:05:43.656: WARN/dalvikvm(28748): threadid=1: thread exiting with uncaught exception (group=0x400259f8)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): FATAL EXCEPTION: main
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@4632f578 with null: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.access$3600(ActivityThread.java:135)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Looper.loop(Looper.java:144)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.main(ActivityThread.java:4937)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invoke(Method.java:521)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at dalvik.system.NativeStart.main(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): Caused by: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at tv.kinobaza.billing.BillingService.onStart(UnkNown Source)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.Service.onStartCommand(Service.java:420)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): ... 10 more
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8),pid=96,w=1,h=1
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8),h=1
04-16 10:05:43.766: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0xb947a8),index=0,w=480,h=418 success
04-16 10:05:43.986: DEBUG/dalvikvm(28721): GC_FOR_MALLOC freed 9604 objects / 1369120 bytes in 102ms
这是相关的代码:
/**
* We don't support binding to this service,only starting the service.
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent,int startId) {
handleCommand(intent,startId);
}
这有什么不对?
我注意到了 – 当设备在夜间睡觉时,一旦我开始使用它,它会在约5分钟内崩溃.
并且,以下是更多详细信息:BillingService从我的应用程序的“首选项”屏幕开始.这里是Preferences类的代码:
@Override
protected void onDestroy() {
mBillingService.unbind();
super.onDestroy();
}
UPD.也许,我应该在Main活动中启动此服务/解除绑定?
这是我的proguard.cfg:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.broadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class com.android.vending.billing.**
-keepclasseswithmembernames class * {
native java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-libraryjars /lib/libGoogleAnalytics.jar
-libraryjars /lib/signpost-commonshttp4-1.2.1.1.jar
-libraryjars /lib/signpost-core-1.2.1.1.jar
-dontwarn org.apache.commons.codec.binary.Base64
你必须混淆一些你不应该喜欢扩展应用程序/活动/服务的类
你不应该混淆这些类:
http://proguard.sourceforge.net/index.html#/manual/examples.html(转到例7)
android – 自定义SimpleCursorAdapter,数据库查询和NullPointerException
这是主要的ListView活动:
public class EditEntries extends ListActivity { Cursor cursor; DBAdapter db = new DBAdapter(this); private static String[] FROM = { _ID,score_COLUMN,"date(time,''localtime'')",}; private static int[] TO = { R.id.rowid,R.id.title,R.id.time,}; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.entries_list); try { cursor = getEvents(); showEvents(cursor); } finally { db.close(); } } private void showEvents(Cursor cursor) { // Set up data binding SMSimpleCursorAdapter adapter = new SMSimpleCursorAdapter(this,R.layout.entries_list_item,cursor,FROM,TO); setlistadapter(adapter); } private Cursor getEvents() { db.open(); cursor = db.getAllscores(); startManagingCursor(cursor); return cursor; } void delRow() { // this is method for deleting row by _id db.open(); db.deletescore(3); // here will be TAG with _id from adapter,db.close(); // for Now I just use hardcoded _id } }
这是自定义的SimpleCursorAdapter:
public class SMSimpleCursorAdapter extends SimpleCursorAdapter{ Cursor c; Context context; Activity activity; public SMSimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to) { super(context,layout,c,from,to); this.c = c; this.context=context; this.activity=(Activity) context; } EditEntries dbDel = new EditEntries(); //from prevIoUs code sample @Override public View getView(int position,View convertView,ViewGroup parent) { if(convertView == null) convertView = View.inflate(context,null); View row = convertView; c.movetoPosition(position); TextView score = (TextView) convertView.findViewById(R.id.title); TextView time = (TextView) convertView.findViewById(R.id.time); TextView id = (TextView) convertView.findViewById(R.id.rowid); id.setText(c.getString(0)); time.setText(c.getString(2)); score.setText(c.getString(1)); String daTag = c.getString(1); ImageButton delButton = (ImageButton) convertView.findViewById(R.id.delButton); delButton.setFocusable(true); delButton.setClickable(true); //delButton.setTag(daTag); delButton.setonClickListener(new OnClickListener() { //Click listener fro delete button @Override public void onClick(View view) { dbDel.delRow(); //this is "delete row" method from previos code sample } }); return(row); } }
当我点击删除按钮时,所有这些东西都给了我NullPointerException.
我是android的新手,并且假设我错过了一些明显的东西.
logcat的:
ERROR/AndroidRuntime(14027): FATAL EXCEPTION: main
ERROR/AndroidRuntime(14027): java.lang.NullPointerException
ERROR/AndroidRuntime(14027): at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:203)
ERROR/AndroidRuntime(14027): at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:98)
ERROR/AndroidRuntime(14027): at namespace.DBAdapter.open(DBAdapter.java:66)
ERROR/AndroidRuntime(14027): at namespace.EditEntries.delRow(EditEntries.java:50)
ERROR/AndroidRuntime(14027): at namespace.SMSimpleCursorAdapter$1.onClick(SMSimpleCursorAdapter.java:64)
ERROR/AndroidRuntime(14027): at android.view.View.performClick(View.java:2414)
ERROR/AndroidRuntime(14027): at android.view.View$PerformClick.run(View.java:8838)
ERROR/AndroidRuntime(14027): at android.os.Handler.handleCallback(Handler.java:587)
ERROR/AndroidRuntime(14027): at android.os.Handler.dispatchMessage(Handler.java:92)
ERROR/AndroidRuntime(14027): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(14027): at android.app.ActivityThread.main(ActivityThread.java:4680)
ERROR/AndroidRuntime(14027): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(14027): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(14027): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
ERROR/AndroidRuntime(14027): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ERROR/AndroidRuntime(14027): at dalvik.system.NativeStart.main(Native Method)
解决方法
EditEntries dbDel = new EditEntries(); //from prevIoUs code sample
您创建一个新对象但它不是托管活动(例如,不会调用onCreate方法).当您尝试第二次(从您的适配器)创建它时,NPE可能来自您的DBAdapter.
快速解决:
EditEntries dbDel; //from prevIoUs code sample public SMSimpleCursorAdapter(Context context,int[] to) { super(context,to); this.c = c; this.context = context; this.activity = (Activity) context; this.dbDel = (EditEntries) context; }
如果您不想只是快速修复,以下将是一个更好的解决方案:
>将delRow,getEvents方法移动到DBAdapter类中>修改SMSimpleCursorAdapter的构造函数以提供DBAdapter类(在ListActivity中创建).
Android中的Spinner和ArrayAdapter NullPointerException
这是我的代码:
public class SlidingTabsActivity extends SherlockFragmentActivity { ViewPager viewPager; TabsAdapter tabsAdapter; ActionBar actionBarTabs; Spinner spinner; ArrayAdapter<String> arrayAdapter; PopupFirmware popupFirmware; // Popup firmware class instance @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewPager = new ViewPager(this); viewPager.setId(R.id.pager); setContentView(viewPager); arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,R.array.device_description); spinner = (Spinner) findViewById(R.id.tabsspinner); spinner.setAdapter(arrayAdapter); actionBarTabs = getSupportActionBar(); actionBarTabs.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBarTabs.setCustomView(spinner); actionBarTabs.setdisplayShowCustomEnabled(true); actionBarTabs.setdisplayHomeAsUpEnabled(true); tabsAdapter = new TabsAdapter(this,viewPager); // Declares the tabs adapter class with the view pager view popupFirmware = new PopupFirmware(this); // Declaring popup firmware class /* Adds fragments to the tabs adapter */ tabsAdapter.addTab(actionBarTabs.newTab().setText("PV"),Fragment_1.class,null); tabsAdapter.addTab(actionBarTabs.newTab().setText("CONfig"),Fragment_2.class,null); tabsAdapter.addTab(actionBarTabs.newTab().setText("DIAG"),Fragment_3.class,null); }
这是logcat:
11-20 13:16:26.259: E/AndroidRuntime(11789): FATAL EXCEPTION: main 11-20 13:16:26.259: E/AndroidRuntime(11789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mobileapplicationretry/com.example.mobileapplicationretry.SlidingTabsActivity}: java.lang.NullPointerException 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2211) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.access$600(ActivityThread.java:141) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.os.Handler.dispatchMessage(Handler.java:99) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.os.Looper.loop(Looper.java:137) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.main(ActivityThread.java:5103) 11-20 13:16:26.259: E/AndroidRuntime(11789): at java.lang.reflect.Method.invokeNative(Native Method) 11-20 13:16:26.259: E/AndroidRuntime(11789): at java.lang.reflect.Method.invoke(Method.java:525) 11-20 13:16:26.259: E/AndroidRuntime(11789): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 11-20 13:16:26.259: E/AndroidRuntime(11789): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 11-20 13:16:26.259: E/AndroidRuntime(11789): at dalvik.system.NativeStart.main(Native Method) 11-20 13:16:26.259: E/AndroidRuntime(11789): Caused by: java.lang.NullPointerException 11-20 13:16:26.259: E/AndroidRuntime(11789): at com.example.mobileapplicationretry.SlidingTabsActivity.onCreate(SlidingTabsActivity.java:51) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.Activity.performCreate(Activity.java:5133) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2175) 11-20 13:16:26.259: E/AndroidRuntime(11789): ... 11 more
解决方法
看,首先创建ViewPager并创建setContentView:
setContentView(viewPager);
但是你的ViewPager是空的,因为你没有放任何东西.接下来你打电话:
spinner = (Spinner) findViewById(R.id.tabsspinner);
这意味着findViewById将查找您的微调器的起始根视图 – 您之前创建的ViewPager是空的.所以Spinner永远不会被发现 – 它总是空的.
关于使用CustomListAdapter时发生NullPointerException和addeventlistener of null的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于android studio NullPointerException at addDrawerListener 方法、android – 为什么使用标准BillingService会发生NullPointerException?、android – 自定义SimpleCursorAdapter,数据库查询和NullPointerException、Android中的Spinner和ArrayAdapter NullPointerException的相关信息,请在本站寻找。
本文标签: