2017-02-17 2 views
-2

Эй, я хочу создать и показать framelayouts в моей андроидной аппликации без xml-макета. Для этого я работаю с Rect и Fragments. Он отлично работает, если все в MainActivity, но если я попытаюсь выполнить в дополнительном классе, я получаю, что операция «Ошибка» была уничтожена.Что означает, что в моем приложении андроид-фрагмента была уничтожена ошибка?

Я хочу создать прямоугольник и внутри этого я хочу загрузить просмотрщик PDF как фрагмент.

Вот мой MainActiticy без нагрузки XML Layout:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MainActivity.thisContext = this; 
     MainActivity.thisActivity = (Activity) this; 

     final PSPDFConfiguration configuration = new PSPDFConfiguration.Builder(BuildConfig.PSPDFKIT_LICENSE_KEY).build(); 
     final Uri documentUri = Uri.parse("file:///android_asset/psp.pdf"); 

     CordovaView viewer = new CordovaView(thisContext,10,10,500,500); 
     viewer.loadFileInView(thisActivity,thisContext,0,300,configuration,documentUri); 


    } 

CordovaView класса. Здесь необходимо создать представления и загрузить файл внутри.

public class CordovaView extends FragmentActivity { 
    private List<WebView>views; 

    public CordovaView(Context ctx,int x,int y,int w, int h){ 
     this.views = new ArrayList<WebView>(); 
     createView(ctx,x,y,w,h); 
    } 

    public void createView(Context ctx, int x, int y, int w, int h){ 
     final Rect rect = new Rect(x, y, x + w, y + h); 

     View view = new WebView(ctx); 

     FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(rect.right - rect.left, rect.bottom - rect.top); 
     params.leftMargin = rect.left; 
     params.topMargin = rect.top; 
     params.gravity = 0; 

     view.setLayoutParams(params); 
     view.setBackgroundColor(Color.BLUE); 

     views.add((WebView) view); 
    } 

    public void showViewById(Activity ac, int index){ 
     WebView view = views.get(index); 
     ac.addContentView(view,view.getLayoutParams()); 
    } 

    public void loadFileInView(Activity ac, Context ctx, int index, int containerId, final PSPDFConfiguration configuration, Uri documentUri){ 

     FrameLayout layout = new FrameLayout(ctx); 
     layout.setId(containerId); 
     WebView view = views.get(index); 
     layout.setLayoutParams(view.getLayoutParams()); 

     view.addView(layout); 

     PSPDFFragment fragment = (PSPDFFragment) getSupportFragmentManager().findFragmentById(layout.getId()); 

//Here I have a error I think :( 

     if(fragment==null){ 
       fragment = PSPDFFragment.newInstance(documentUri,configuration); 
       getSupportFragmentManager() 
         .beginTransaction() 
         .replace(layout.getId(),fragment) 
         .commit(); 
     } 

     showViewById(ac,index); 
    } 
} 

Моя ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: de.wladimir.tarasov.pdfframelayout, PID: 9932 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{de.wladimir.tarasov.pdfframelayout/de.wladimir.tarasov.pdfframelayout.MainActivity}: java.lang.IllegalStateException: Activity has been destroyed 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2491) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2564) 
         at android.app.ActivityThread.access$800(ActivityThread.java:170) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1441) 
         at android.os.Handler.dispatchMessage(Handler.java:111) 
         at android.os.Looper.loop(Looper.java:194) 
         at android.app.ActivityThread.main(ActivityThread.java:5576) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 
        Caused by: java.lang.IllegalStateException: Activity has been destroyed 
         at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1854) 
         at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:643) 
         at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603) 
         at de.wladimir.tarasov.pdfframelayout.CordovaView.loadFileInView(CordovaView.java:82) 
... 
... 
+0

[Вы задали тот же вопрос вчера] (http://stackoverflow.com/questions/42273971/how-i-can-fix-the-error-activity-has-been-destroyed-in-my- class-with-getsupp) ... и ** вы получите ответ ** .. ** речь идет о операторе 'new' и' activity' производном классе ** ... пожалуйста, не переставляйте вопрос – Selvin

+0

это не поможет Мне очень нравится. – Tarasov

+0

Я удаляю другой вопрос, потому что я пытаюсь спросить лучше – Tarasov

ответ

1
  • CordovaView имеет неправильное название, поскольку это не распространяется View, но распространяется FrameActivity - это несколько вводит в заблуждение. Переименуйте в CordovaActivity.
  • MainActivity.thisContext = this; и MainActivity.thisActivity = (Activity) this; - это статические ссылки на вашу деятельность? Не используйте статические ссылки на свою деятельность. Даже если они не являются общедоступными (если они общедоступны - удаляют общедоступные и удаляют статические данные). И поскольку вам не нужна ссылка на вашу деятельность внутри той же самой деятельности - удалите эту ссылку вообще и используйте this везде, где она вам нужна.
    У вас может быть некоторый экземпляр активности в таких ссылках, но активность может быть уже уничтожена, поэтому вы не можете полагаться на такие ссылки в любом случае, поэтому вам лучше удалить их и узнать другие способы делать то, что вы хотите.
  • Итак, вы создаете новую активность, используя new, а затем вызываете какой-то метод для этого мероприятия? Затем вам, наконец, нужно будет прочитать документы, как начать Activity: https://developer.android.com/training/basics/firstapp/starting-activity.html
    Вы создали экземпляр Activity, но он не запущен в вашем случае. И когда вы пытаетесь прикрепить какой-то фрагмент к своей деятельности (которая не запущена) - конечно, вы должны ожидать кучу ошибок. Для начала своей деятельности один ДОЛЖЕН отправить Intent в систему.
    Вместо передачи параметров через конструктор вы должны передать эти параметры в дополнениях Intent.
Смежные вопросы