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 クラスからメソッドを呼び出して、新しいフラグメントを追加しようとしています。このメソッドが呼び出されると、アプリがクラッシュします

Stackoverflow の別のスレッドで、Super Oncreate メソッドで何かを行う必要があることを読みましたが、何が問題なのか正確にはわかりません。

誰でもこれで私を助けることができます..? これを理解することは私にとって非常に重要です。なぜなら、最近ではフラグメントが基本的に進むべき道だと信じているからです。

4

1 に答える 1

1

あなたはこれを行うことはできません:

  TabControllerMeldingen newFragment = new TabControllerMeldingen();

すべてのアクティビティは、フレームワークを介して作成する必要があります。ただし、すでに1つの内部にいる(getActivity()メソッドを使用する)ため、この場合も同じことを行う必要があります。アクティビティを取得し、その上にフラグメントを追加します。

于 2012-06-14T15:03:05.853 に答える