2013-11-23 5 views
0

Здравствуйте, я работаю над приложением, которое будет андроид-пусковой установкой, в этом пусковом устройстве есть три разных экрана, первый экран - книжная полка, которая должна импортировать и показать все книги на карте памяти SD на устройстве, второй - калькулятор (отлично работает!). Третья страница домашней работы, где вы можете делать документы и флешки для Google (также отлично работает !!) Я не получаю ошибок, когда Я запускаю свой код, приложение автоматически сбой, когда оно запускается на моем устройстве и на эмуляторе.Не удалось запустить Activity ComponentInfo {MainFrag}: java.lang.NullPointerException

Heres мой Logcat:

11-23 15:05:06.314: E/SurfaceFlinger(323): ro.sf.lcd_density must be defined as a build property 
11-23 15:05:15.084: E/Trace(3807): error opening trace file: No such file or directory (2) 
11-23 15:05:15.254: E/AndroidRuntime(3807): FATAL EXCEPTION: main 
11-23 15:05:15.254: E/AndroidRuntime(3807): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.d4a.tobias/it.gmariotti.android.examples.googleaccount.MainFrag}: java.lang.NullPointerException 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.os.Looper.loop(Looper.java:137) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at dalvik.system.NativeStart.main(Native Method) 
11-23 15:05:15.254: E/AndroidRuntime(3807): Caused by: java.lang.NullPointerException 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at com.sibext.android_shelf.adapter.ShelfAdapter.setToListView(ShelfAdapter.java:70) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at it.gmariotti.android.examples.googleaccount.MainFrag.onCreate(MainFrag.java:78) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.Activity.performCreate(Activity.java:5104) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
11-23 15:05:15.254: E/AndroidRuntime(3807):  ... 11 more 
11-23 15:05:15.354: E/SurfaceFlinger(323): ro.sf.lcd_density must be defined as a build property 
11-23 15:05:15.824: E/SurfaceFlinger(323): ro.sf.lcd_density must be defined as a build property 
11-23 15:07:05.354: E/SurfaceFlinger(323): ro.sf.lcd_density must be defined as a build property 

Heres MainFrag.java:

package it.gmariotti.android.examples.googleaccount; 


    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.Context; 
    import android.content.Intent; 
    import android.content.res.AssetManager; 

    import android.os.Bundle; 
    import android.os.Environment; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 
    import android.support.v4.view.ViewPager; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.Window; 
    import android.widget.ListView; 
    import android.widget.Toast; 

    import com.d4a.tobias.R; 
    import com.sibext.android_shelf.ImportBooks; 
    import com.sibext.android_shelf.adapter.ShelfAdapter; 


    public class MainFrag extends FragmentActivity{ 

      private MyAdapter mAdapter; 
     private ViewPager mPager; 
     //Shelf 
     private static final String TARGET_DIRECTORY = "mnt/sdcard/shelf/"; 
     private ListView list; 


     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

       setContentView(R.layout.mainfrag); 


       mAdapter = new MyAdapter(getSupportFragmentManager()); 
       mPager = (ViewPager) findViewById(R.id.pager); 
       mPager.setAdapter(mAdapter); 

      //  TitlePageIndicator titleIndicator = (TitlePageIndicator) findViewById(R.id.titles); 
      //  titleIndicator.setViewPager(mPager);   
       // pts=(PagerTitleStrip)findViewById(R.id.pager_title_strip); 

       //Shelf 

       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)findViewById(R.id.list); 

       ShelfAdapter adapter = new ShelfAdapter(this, TARGET_DIRECTORY); 
       adapter.setToListView(list); 

     } 
     public static class MyAdapter extends FragmentPagerAdapter { 
      String arr[]={"Calculator","Books","Homework"}; 

      public MyAdapter(FragmentManager fm) { 
         super(fm); 
       } 
       @Override 
       public CharSequence getPageTitle(int position) { 
        // TODO Auto-generated method stub 
        return arr[position]; 
       } 
       @Override 
       public int getCount() { 
         return arr.length; 
       } 
       @Override 
       public Fragment getItem(int position) { 
         switch (position) { 
         case 0: 
           return new Calculator(); 
         case 1: 
           return new Book(); 

         case 2: 
          return new Homework(); 

         default: 
           return null; 
         } 
       } 
     } 
    //Shelf 

     public void addBooksFromAssetsToCard(){ 
      List<String> books; 
      try { 
       books = getBooksFromAsset(getApplicationContext()); 

       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 = 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(getApplicationContext(), "Please wait...", Toast.LENGTH_LONG).show(); 
      Intent in = new Intent(getApplicationContext(), ImportBooks.class); 
      startActivity(in); 
     } 


    } 

EDIT ADDED Shelf Adapter.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.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 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

Вам необходимо опубликовать код для ShelfAdapter. Это линия 70, которая бросает NPE. – Squonk

+0

добавил его к сообщению, пожалуйста, проверьте его! – user2977501

+0

Дважды проверьте, что у вас есть 'ListView' в вашем файле макета mainfrag.xml, определенном с помощью' android: id = "@ + id/list' - еще лучше, разместите файл mainfrag.xml. – Squonk

ответ

1

list = (ListView)findViewById(R.id.list);10 null null, потому что ваш список еще не создан. Переопределите onViewCreated() и разместите там свой код.

+0

Да? Вы можете это объяснить? – Squonk

+0

Спасибо за быстрый ответ. Я все еще учусь, можете ли вы быть более конкретным? Спасибо !!! – user2977501

+0

@ user2977501: Причина, по которой я начал свой комментарий (выше) с помощью «А?», Заключается в том, что ответ от grexter89 не делает смысл: – Squonk

0

Ваша проблема здесь: adapter.setToListView (список); должно быть что-то вроде: list.setAdapter (...), но у вас есть еще одна ошибка в ShelfAdapter.java, можете ли вы скопировать то, что вы написали с строки 65 на строку 70?

+0

Не совсем - код, который вы предлагаете, оказывается присутствующим внутри метода setToListView(), но проблема в том, что список имеет значение null, и вы не можете вызывать методы нулевой объект. –

Смежные вопросы