您好我正在开发一个应用程序,它将成为Android启动器,此启动器中有三个不同的屏幕,第一个屏幕是一个应该导入的书架,显示设备上SD卡位置的所有书籍当我带来我的代码时,没有错误,但是当它在我的设备和模拟器上启动时,应用程序会自动崩溃。
logcat的:
11-24 11:23:30.208: E/AndroidRuntime(16101): FATAL EXCEPTION: main
11-24 11:23:30.208: E/AndroidRuntime(16101): java.lang.NullPointerException
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.sibext.android_shelf.adapter.ShelfAdapter.getSubItemsCount(ShelfAdapter.java:96)
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.sibext.android_shelf.adapter.ShelfAdapter.getCount(ShelfAdapter.java:91)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.ListView.setAdapter(ListView.java:463)
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.sibext.android_shelf.adapter.ShelfAdapter.setToListView(ShelfAdapter.java:77)
11-24 11:23:30.208: E/AndroidRuntime(16101): at it.gmariotti.android.examples.googleaccount.Book.onCreateView(Book.java:199)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.Choreographer.doFrame(Choreographer.java:532)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.os.Handler.handleCallback(Handler.java:730)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.os.Handler.dispatchMessage(Handler.java:92)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.os.Looper.loop(Looper.java:137)
11-24 11:23:30.208: E/AndroidRuntime(16101): at android.app.ActivityThread.main(ActivityThread.java:5103)
11-24 11:23:30.208: E/AndroidRuntime(16101): at java.lang.reflect.Method.invokeNative(Native Method)
11-24 11:23:30.208: E/AndroidRuntime(16101): at java.lang.reflect.Method.invoke(Method.java:525)
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-24 11:23:30.208: E/AndroidRuntime(16101): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-24 11:23:30.208: E/AndroidRuntime(16101): at dalvik.system.NativeStart.main(Native Method)
Book.java:
package com.d4a.tobias;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
import com.d4a.tobias.R;
import com.sibext.android_shelf.ImportBooks;
import com.sibext.android_shelf.adapter.ShelfAdapter;
public class Book extends SherlockFragment {
Button bt1;
//Shelf
private static final String TARGET_DIRECTORY = "mnt/sdcard/shelf/";
private ListView list;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Get the view from fragmenttab1.xml
View v=inflater.inflate(R.layout.fragmenttab1, container, false);
File dir = new File(TARGET_DIRECTORY);
if(!dir.exists()){
dir.mkdirs();
//past here
addBooksFromAssetsToCard();
}else{
String files[] = dir.list();
if(files.length == 0){
//past here
addBooksFromAssetsToCard();
}
}
list = (ListView) v. findViewById(R.id.list);
//buttons for toolbelt do not take out!!
v. findViewById(R.id.button10).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String url = "http://www.google.com";
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
}
});
v. findViewById(R.id.button11).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// String url = "http://www.google.com";
// Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// startActivity(browserIntent);
Intent i=new Intent(getActivity().getApplicationContext(),Launchalot.class);
startActivity(i);
}
});
v. findViewById(R.id.tools).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// String url = "http://www.google.com";
// Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// startActivity(browserIntent);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.d4a.stz","com.d4a.stz.ToolsHome"));
intent.putExtra("grace", "Hi");
startActivity(intent);
}
});
v. findViewById(R.id.googleplay).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// String url = "http://www.google.com";
// Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// startActivity(browserIntent);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://play.google.com/store/apps"));
startActivity(intent);
}
});
v. findViewById(R.id.youtube).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// String url = "http://www.google.com";
// Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// startActivity(browserIntent);
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
startActivity(videoClient);
}
});
v. findViewById(R.id.email).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.d4a.eMailTime","com.fsck.k9.activity.Accounts"));
intent.putExtra("grace", "Hi");
startActivity(intent);
}
});
ShelfAdapter adapter = new ShelfAdapter(this, TARGET_DIRECTORY);
adapter.setToListView(list);
return v;
}
public void addBooksFromAssetsToCard(){
List<String> books;
try {
books = getBooksFromAsset(getActivity());
for(String book : books){
copyFromAssets(book);
}
} catch (Exception e) {
}
}
public List<String> getBooksFromAsset(Context ctx) throws Exception
{
AssetManager assetManager =ctx.getAssets();
String[] files = assetManager.list("books");
List<String> it=Arrays.asList(files);
return it;
}
public void copyFromAssets(String book)
{
AssetManager assetManager = getActivity().getAssets();
String[] files = null;
InputStream in = null;
OutputStream out = null;
//String filename = "filename.ext";
try
{
in = assetManager.open("books/"+book);
out = new FileOutputStream(Environment.getExternalStorageDirectory()+File.separator+"/shelf/"+book);
Log.d("Copying...", ""+book);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
}
catch(Exception e)
{
Log.e("tag", "Failed to copy asset file: " + book, e);
}
}
public void copyFile(InputStream in, OutputStream out) throws Exception
{
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
Log.d("Copy_State", "Done...");
}
public void onImportClicked(View v){
Toast.makeText(getActivity(), "Please Wait", Toast.LENGTH_LONG)
.show();
Intent in = new Intent(getActivity(), ImportBooks.class);
startActivity(in);
return;
}
}
ShelfAdapter.java
package com.sibext.android_shelf.adapter;
import java.io.File;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.SparseArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.Toast;
import com.d4a.tobias.Book;
import com.d4a.tobias.R;
import com.sibext.android_shelf.MainActivity;
import com.sibext.android_shelf.shelf.ShelfItem;
public class ShelfAdapter extends BaseAdapter {
private static final int ROW_COUNT_DEFAULT = 2;
private static final int ROW_COUNT_LAND_DEFAULT = 4;
private static final int ROW_HEIGHT_DEFAULT = 150;
private Context context;
private int rowCount = ROW_COUNT_DEFAULT;
private int rowCountLand = ROW_COUNT_LAND_DEFAULT;
private int rowHeight = ROW_HEIGHT_DEFAULT;
private SparseArray<LoadPreviewTask> taskPool;
private ArrayList<ShelfItem> items;
String PATH;
ShelfItem item;
public ShelfAdapter(Context context, String targetDir) {
this.context = context;
items = new ArrayList<ShelfItem>();
taskPool = new SparseArray<ShelfAdapter.LoadPreviewTask>();
if (targetDir == null || context == null) {
throw new NullPointerException("ShelfAdapter: wrong paramenters - " +
(targetDir == null ? "Target directory " : "Context ") + "is null");
}
File dir = new File(targetDir);
if(dir.exists() && dir.isDirectory()){
for(File f : dir.listFiles()){
if(f != null && f.getName().endsWith(".pdf")){
items.add(new ShelfItem(f));
}
}
}
}
public ShelfAdapter(Book book, String targetDirectory) {
// TODO Auto-generated constructor stub
}
public void setToListView(ListView list){
list.setDividerHeight(0);
list.setAdapter(this);
}
public void setRowCount(int rowCount, int rowCountLand) {
this.rowCount = rowCount;
this.rowCountLand = rowCountLand;
}
public void setRowHeight(int rowHeight) {
this.rowHeight = rowHeight;
}
@Override
public int getCount() {
int sub = getSubItemsCount();
return (int)(sub/getRowCount()) + (sub%getRowCount() == 0 ? 0 : 1);
}
public int getSubItemsCount(){
return items.size();
}
@Override
public ShelfItem getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.shelf_row, null);
AbsListView.LayoutParams itemParams = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, rowHeight);
convertView.setLayoutParams(itemParams);
LinearLayout.LayoutParams subItemParams = getSubViewParams();
for(int i = 0; i < getRowCount(); i++){
View sub = getSubView(getSubPosition(position, i), null);
sub.setLayoutParams(subItemParams);
((ViewGroup)convertView).addView(sub);
holder.subViews.add(sub);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
for(int i = 0; i < holder.subViews.size(); i++){
getSubView(getSubPosition(position, i), holder.subViews.get(i));
}
}
return convertView;
}
public View getSubView(final int position, View convertView){
final SubViewHolder holder;
if(convertView == null){
convertView = View.inflate(context, R.layout.shelf_item, null);
holder = new SubViewHolder();
holder.img = (ImageView)convertView.findViewById(R.id.shelf_item_image);
convertView.setTag(holder);
} else {
holder = (SubViewHolder)convertView.getTag();
}
if(position >= getSubItemsCount()){
holder.img.setImageBitmap(null);
return convertView;
}
item = getItem(position);
PATH = item.getFile().getAbsolutePath();
Bitmap preview = item.getPreviewFromSD();
if(preview != null){
holder.img.setImageBitmap(preview);
} else {
holder.img.setImageResource(R.drawable.ic_launcher);
LoadPreviewTask task = taskPool.get(holder.hashCode());
if (task != null) {
task.cancel(true);
taskPool.remove(holder.hashCode());
task = null;
}
task = new LoadPreviewTask(holder, rowHeight);
taskPool.put(holder.hashCode(), task);
task.execute(item);
}
holder.img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final ShelfItem si = items.get(position);
/*Toast.makeText(context, "Item #" + position+"\n"+si.getFile().getAbsolutePath(), Toast.LENGTH_SHORT).show();
*/
final CharSequence[] items = {"View", "Delete"};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Please choose:");
builder.setItems(items, new DialogInterface.OnClickListener() {
//Toast.makeText(getApplicationContext(), ""+items[0], Toast.LENGTH_SHORT).show();
public void onClick(DialogInterface dialog, int index) {
if(index == 0){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(si.getFile()),"application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
}else if(index == 1){
File file = new File(si.getFile().getAbsoluteFile().toString());
boolean deleteStatus = file.delete();
if(deleteStatus){
Toast.makeText(context, "Deleted Successfully...", Toast.LENGTH_SHORT).show();
Intent in = new Intent(context, MainActivity.class);
context.startActivity(in);
}else{
Toast.makeText(context, "Unable to delete...", Toast.LENGTH_SHORT).show();
}
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
return convertView;
}
private int getSubPosition(int listItemPosition, int offset){
return listItemPosition * getRowCount() + offset;
}
private LinearLayout.LayoutParams getSubViewParams(){
LinearLayout.LayoutParams p = new LayoutParams(0, LayoutParams.MATCH_PARENT);
p.weight = 1f;
return p;
}
private int getRowCount() {
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
? rowCount : rowCountLand;
}
private static class ViewHolder{
public ArrayList<View> subViews;
public ViewHolder() {
this.subViews = new ArrayList<View>();
}
}
private static class SubViewHolder{
public ImageView img;
}
private class LoadPreviewTask extends AsyncTask<ShelfItem, Void, Bitmap>{
private SubViewHolder holder;
private int rowHeight;
public LoadPreviewTask(SubViewHolder holder, int rowHeight) {
super();
this.holder = holder;
this.rowHeight = rowHeight;
}
@Override
protected Bitmap doInBackground(ShelfItem... params) {
ShelfItem item = (ShelfItem)params[0];
Bitmap preview = item.getPreview(rowHeight);
item.savePreview(preview);
return preview;
}
@Override
protected void onPostExecute(final Bitmap result) {
if(isCancelled()){
holder = null;
return;
}
holder.img.setImageBitmap(result);
taskPool.remove(holder.hashCode());
}
}
}
我还是Android的新手,所以请不要评判,任何帮助将不胜感激
提前致谢
答案 0 :(得分:0)
items
在调用null
时为getSubItemsCount()
。
public int getSubItemsCount(){
return items.size();
}
它从未被初始化!
private ArrayList<ShelfItem> items;
...
public ShelfAdapter(Book book, String targetDirectory) {
// TODO Auto-generated constructor stub
}
修复是在构造函数中初始化它。
public ShelfAdapter(Book book, String targetDirectory) {
items = new ArrayList<ShelfItem>();
// Whatever else you need to do
}