2015-07-25 3 views
2

Как экспортировать подвид фрагмента из другого фрагмента в виде Png?Экспорт подзаголовка фрагмента из другого фрагмента как Png

Контекст

I'am создания приложения, которое позволяет пользователю создавать персонализированные резюме. Пользователь может предоставить информацию о своем опыте работы и навыках. В результате пользователь может экспортировать свои результаты в виде png и сохранить его на устройстве. Мой вопрос направлен на экспорт-функциональность приложения.

enter image description here

Что я получил до сих пор

Я попытался объединить несколько ответов от сайта, чтобы получить результат, но, к сожалению, код, который у меня есть не работает до сих пор.

public void export(Context context) throws FileNotFoundException { 

    View exportView = getLayoutInflater(getArguments()).inflate(R.layout.fragment_form, null, false); 
    RelativeLayout subView = (RelativeLayout) exportView.findViewById(R.id.fragment_form_container_root); 

    try { 

     subView.setDrawingCacheEnabled(true); 
     subView.measure(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 

     Bitmap b = Bitmap.createBitmap(subView.getDrawingCache(), 0, 0, subView.getMeasuredWidth(), subView.getMeasuredHeight()); 

     File cachePath = new File(context.getCacheDir(), "images"); 
     cachePath.mkdirs(); // don't forget to make the directory 
     FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time 
     b.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     stream.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    File imagePath = new File(context.getCacheDir(), "images"); 
    File newFile = new File(imagePath, "image.png"); 
    Uri contentUri = FileProvider.getUriForFile(context, "com.example.lukas.masterthesis.fileprovider", newFile); 

    if (contentUri != null) { 

     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file 
     shareIntent.setDataAndType(contentUri, getActivity().getContentResolver().getType(contentUri)); 
     shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 
     startActivity(Intent.createChooser(shareIntent, "Choose an app")); 

    } 

} 

Функциональность export вызывается внутри фрагмента A после события click. Я пытаюсь получить требуемое представление в Fragment B (похоже, что работает), но создание Bitmap всегда приводит к нулевому объекту. Поэтому процедура терпит неудачу.

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null 

Честно говоря им даже не уверен, что это правильный способ сделать такую ​​вещь, так как я не нашел решение Лучшей практики для того, что пытается им. Если нет, знает ли кто-нибудь лучший способ сделать это?

Если это «нормально» решение, знает ли кто-нибудь, как заставить мой код работать или есть предложения, которые могут указывать на меня в правильном направлении?

Thx заранее.

ответ

0

Просто хотел дать ответ.

Я был в основном на правильном пути. Закончилось разделение моего представления на более мелкие части, поскольку рисование кеша было небольшим, чтобы обрабатывать все сразу. Это может помочь кому-то, кто столкнулся с подобной проблемой.

Первая часть кода рисует каждую часть в результирующем растровом изображении. Вторая часть позволяет пользователю экспортировать его (например, в Dropbox).

Так вот вы идете

public void export() throws FileNotFoundException { 

    View exportView = rootView.findViewById(R.id.fragment_form_container_root); 
    View view_title = rootView.findViewById(R.id.fragment_form_container_title); 
    View view_basicInformation = rootView.findViewById(R.id.fragment_form_container_basicinformation); 
    View view_experience_skill = rootView.findViewById(R.id.fragment_form_container_experience_skill); 
    View view_connect = rootView.findViewById(R.id.fragment_form_container_connect); 
    View view_footer = rootView.findViewById(R.id.fragment_form_container_footer); 


    try { 

     view_title.setDrawingCacheEnabled(true); 
     view_title.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
     Bitmap b0 = Bitmap.createBitmap(view_title.getDrawingCache()); 
     view_title.setDrawingCacheEnabled(false); 

     view_basicInformation.setDrawingCacheEnabled(true); 
     view_basicInformation.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
     Bitmap b1 = Bitmap.createBitmap(view_basicInformation.getDrawingCache()); 
     view_basicInformation.setDrawingCacheEnabled(false); 


     view_experience_skill.setDrawingCacheEnabled(true); 
     view_experience_skill.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
     Bitmap b2 = Bitmap.createBitmap(view_experience_skill.getDrawingCache()); 
     view_experience_skill.setDrawingCacheEnabled(false); 

     view_connect.setDrawingCacheEnabled(true); 
     view_connect.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
     Bitmap b3 = Bitmap.createBitmap(view_connect.getDrawingCache()); 
     view_connect.setDrawingCacheEnabled(false); 

     view_footer.setDrawingCacheEnabled(true); 
     view_footer.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
     Bitmap b4 = Bitmap.createBitmap(view_footer.getDrawingCache()); 
     view_footer.setDrawingCacheEnabled(false); 


     Bitmap result = Bitmap.createBitmap(exportView.getWidth(), exportView.getHeight(), Bitmap.Config.ARGB_8888); 

     Canvas canvas = new Canvas(result); 
     //canvas.setDensity(300); 
     Paint paint = new Paint(); 
     paint.setFlags(Paint.FILTER_BITMAP_FLAG); 
     paint.setFlags(Paint.ANTI_ALIAS_FLAG);   

     canvas.drawBitmap(b0, 0, 0, paint); 
     canvas.drawBitmap(b1, 0, b0.getHeight(), paint); 
     canvas.drawBitmap(b2, 0, b0.getHeight() + b1.getHeight(), paint); 
     canvas.drawBitmap(b3, 0, b0.getHeight() + b1.getHeight() + b2.getHeight(), paint); 
     canvas.drawBitmap(b4, 0, b0.getHeight() + b1.getHeight() + b2.getHeight() + b3.getHeight(), paint); 

     File cachePath = new File(string_CachePath, "images"); // -> string_CachePath == context.getCacheDir(); 
     cachePath.mkdirs(); // don't forget to make the directory 
     FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time 
     result.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     stream.close(); 

     File newFile = new File(cachePath.getPath(), "image.png"); 

     Uri contentUri = FileProvider.getUriForFile(getActivity(), "com.example.lukas.masterthesis.fileprovider", newFile); 

     if (contentUri != null) { 

      Intent shareIntent = new Intent(); 
      shareIntent.setAction(Intent.ACTION_SEND); 
      shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file 
      shareIntent.setDataAndType(contentUri, getActivity().getContentResolver().getType(contentUri)); 
      shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 
      startActivity(Intent.createChooser(shareIntent, "Choose an app")); 

     } 



    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
1

попробуйте использовать

try using bitmap = Bitmap.createBitmap(subView.getDrawingCache()); 

вместо

Bitmap b = subView.getDrawingCache(); 
+0

Это не имеет никакого эффекта, только сообщение об ошибке меняется: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'INT android.graphics.Bitmap.getWidth()' по ссылке на нулевой объект – luQ

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