1

fragmentActivity에서 새 단편을 시작하려고합니다.하지만 시도 할 때마다 오류가 발생합니다. 즉, 활동이 삭제되었습니다. tabController에서활동이 파괴되었습니다 예외

소스 코드는 내가 만든 :

package com.crosscommunications.kvodeventer; 

import java.io.File; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.View; 

public class TabControllerMeldingen extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tabcontroller); 

     final File f = new File("/data/data/com.crosscommunications.kvodeventer/files/data.txt"); 

     if (f.exists()) { 
      System.out.println("File existed"); 
      addFragment(new KVOCards(), false, FragmentTransaction.TRANSIT_NONE); 

     } else { 
      System.out.println("File not found!"); 
      addFragment(new KVOMeldingen(), false, FragmentTransaction.TRANSIT_NONE); 
     } 

    } 

    public void addFragment(Fragment fragment, boolean addToBackStack, int transition) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.simple_fragment, fragment); 
     ft.setTransition(transition); 
     if (addToBackStack) 
      ft.addToBackStack(null); 
     ft.commit(); 
    } 

    public void finishFragmentOrActivity(View v) { 
     FragmentManager manager = getSupportFragmentManager(); 
     if (manager.getBackStackEntryCount() > 0) 
      getSupportFragmentManager().popBackStack(); 
     else 
      finish(); 
    } 

    public void launchNewFragment(View v) { 
     addFragment(new KVOOver(), true, FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    } 
} 

이 코드는 대부분의 경우 KVOMeldingen 클래스를 엽니 다. 따라서 KVOMeldingen의 출처는 다음과 같습니다.

package com.crosscommunications.kvodeventer; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

import org.json.JSONObject; 

import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
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.EditText; 


public class KVOMeldingen extends Fragment { 

    static String Username; 
    static String Password; 
    static String LoginResult; 
    static String LoginOk = "vet"; 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View fragmentView = inflater.inflate(R.layout.kvomeldingen, container, false); 
     final EditText etUsername = (EditText) fragmentView.findViewById(R.id.etUsername); 
     final EditText etPassword = (EditText) fragmentView.findViewById(R.id.etPassword); 
     Button bLogin = (Button) fragmentView.findViewById(R.id.bLogin); 
     Button bCreateAccount = (Button) fragmentView.findViewById(R.id.bCreateAccount); 
     Button bResetPassword = (Button) fragmentView.findViewById(R.id.bResetPassword); 

     bLogin.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (etUsername.length() <= 0) { 
        etUsername.setError("Veld mag niet leeg zijn"); 
       } else if (etPassword.length() <= 0) { 
        etPassword.setError("Veld mag niet leeg zijn"); 
       } else { 
        Username = etUsername.getText().toString(); 
        Password = etPassword.getText().toString(); 
       } 
       LoginTask NDLT = new LoginTask(); 
       NDLT.execute(); 
      } 
     }); 

     bCreateAccount.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (etUsername.length() <= 0) { 
        etUsername.setError("Veld mag niet leeg zijn"); 
       } else if (etPassword.length() <= 0) { 
        etPassword.setError("Veld mag niet leeg zijn"); 
       } else { 
        Username = etUsername.getText().toString(); 
        Password = etPassword.getText().toString(); 
       } 
       RegisterTask RegTask = new RegisterTask(); 
       RegTask.execute(); 
      } 

     }); 

     bResetPassword.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (etUsername.length() <= 0) { 
        etUsername.setError("Veld mag niet leeg zijn"); 
       } else if (etPassword.length() <= 0) { 
        etPassword.setError("Veld mag niet leeg zijn"); 
       } else { 
        Username = etUsername.getText().toString(); 
        Password = etPassword.getText().toString(); 
       } 
       ForgotTask forgTask = new ForgotTask(); 
       forgTask.execute(); 

      } 

     }); 

     return fragmentView; 
    } 

    class LoginTask extends AsyncTask<Void, Void, JSONObject> { 

     ProgressDialog waitingDialog; 

     @Override 
     protected void onPreExecute() { 
      waitingDialog = new ProgressDialog(getActivity()); 
      waitingDialog.setMessage("Laden..."); 
      waitingDialog.show(); 
      super.onPreExecute(); 
     } 

     @Override 
     protected JSONObject doInBackground(Void... params) { 

      JSONObject json = JsonFunctions 
        .getJsonLoginResult("http://api.crossalertdeventer.nl/login.json"); 
      return json; 

     } 

     @Override 
     protected void onPostExecute(JSONObject json) { 
      super.onPostExecute(json); 
      if (waitingDialog.isShowing()) { 
       waitingDialog.dismiss(); 
      } 
      try { 

       LoginResult = json.getString("login"); 

       Log.d("LoginResult", LoginResult); 

       if (LoginResult.equals("success")) { 

        WriteSettings(getActivity(), Username, Password, 
          "data.txt"); 

        TabControllerMeldingen newFragment = new TabControllerMeldingen(); 
        newFragment.addFragment(new KVOCards(), false, FragmentTransaction.TRANSIT_NONE); 


       } else if (LoginResult.equals("failed")) { 
        final AlertDialog alertDialog = new AlertDialog.Builder(
          getActivity()).create(); 
        alertDialog.setTitle("Fout"); 
        alertDialog 
          .setMessage("Gebruikersnaam of wachtwoord incorrect"); 
        alertDialog.setButton("Ok", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int which) { 
            alertDialog.dismiss(); 
           } 

          }); 
        alertDialog.show(); 
       } 

      } catch (Exception e) { 
       Log.e("KVOMeldingen", "error" + e.getMessage()); 

      } 

     } 
} 

이 소스는 실제로 크기가 더 큽니다 (반으로 자름).

하지만 AsyncTask에서 TabControllerMeldingen 클래스의 메서드를 호출하여 새로운 조각을 추가하려고합니다. 이 메서드가 호출되면 응용 프로그램이 충돌합니다.

나는 SuperOrcreate 메서드로 무언가를해야한다는 stackoverflow의 다른 스레드를 읽었지만 정확히 무엇이 잘못되고 있는지 파악할 수 없습니다.

아무도 도와 줄 수 있습니까 ..? 나는 조각이 근본적으로 요즘 갈 길임을 믿기 때문에 이것을 이해하는 것이 정말로 중요합니다.

답변

1

이 작업을 수행 할 수 없습니다

TabControllerMeldingen newFragment = new TabControllerMeldingen(); 

모든 활동이 프레임 워크를 통해 만들 수 있습니다. 그러나 이미 내부에 있습니다 (getActivity() 메서드 사용).이 경우에도 동일한 작업을 수행해야합니다. 액티비티를 가져 와서 그 부분을 추가하십시오.

+0

예, 그게 전부입니다. 2 초 동안 내 대답을 이길 :) – Bostone

+0

당신은 의미 : getActivity(). addFragment(); –

+0

예, 아마도 캐스트해야합니다. 그리고 액티비티 클래스가'addFragment()'메소드를 가지고 있다고 가정합니다 :) – dmon

관련 문제