0

最終更新

問題がすべて間違っていたことがわかりました。Fragmentタグの使い方でした。完全な説明を得るには、以下の私の回答を参照してください。

更新 3 : そのため、何時間もいじり続けてきましたが、そのような運はありませんでした。クラッシュしないところまで到達することができました。しかし今、私は問題が何であるかを知っていると信じています. calendarAdapternullだったのでnullになっていましたが、私の意図ではありませんでした。onCreateViewどうやら何かが送信される前と、いくつかのパラメーターを正式に送信した後に、2回実行されているようです。もちろん、これは起こるべきではありません...私は思います。ActionBar が下部に設定されている部分を提供しますので、この動作をそのまま設定するために何か間違ったことをしている場合はお知らせください。


何らかの理由でこの特定の問題が発生していますが、その理由がわかりません。と呼ばれるアクティビティと と呼ばMainDisplayActivityれるフラグメントがありMainDislpayFragmentます。ご想像のとおり、Activity はアプリの起動時に Fragment を設定します。これが問題newInstanceです。カレンダーから取得した 3 つの数値をパラメーターとしてコンストラクターに送信しようとしました。次に、コンストラクター内から Calendar を作成しました。しかし、私のアプリはクラッシュします。奇妙な部分は、カレンダーが静的フィールドで使用されないようにすると、アプリは期待どおりに動作しますが、コンストラクターから取得したものからカレンダーを使用しようとすると、クラッシュします。これはメソッドの例です:

private static Calendar cal;

static MainDisplayFragment newInstance(Context context, int y, int m, int d) {

    c = context;
    MainDisplayFragment f = new MainDisplayFragment();
    //static global Calendar now
            cal = Calendar.getInstance();
            cal.set(y, m, d);
}//end of static newInstance method

Calendar を取り出して onCreate に入れようとしても、静的 int のみをグローバルとして取得してそこに設定しようとしても、クラッシュが発生することに注意することが重要です。注目すべきエラーと奇妙な点は、Calendar が何らかの理由で null であると考えているように見えることです。すぐにわかるように、それは間違いなく作成されています。しかし今、カレンダーと静的フィールドに問題があると思い始めています。そうでない場合は、エラーが発生している可能性がありますが、可能であれば除外したかったのです。誰の応答にも感謝します。

更新:私はそのカレンダー情報を my に渡すためだけに使用していることに言及する必要がありますMyCalendarAdapter。パラメータとして数値を送信するだけなのか、カレンダー自体を送信するのかに関係なく、クラッシュします。最初に表示される null 例外は、MyCalendarAdapter.

行 75 は、ここでは最後の行になります。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.main_fragment, container, false);
    calendarAdapter = new MyCalendarAdapter(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));

更新 2 :


さらにいじった後、問題がにあることに気付きましたMyCalendarAdapterが、それは意味をなさない問題です。引数なしで calendarAdapter をインスタンス化すると完全に機能するようですが、引数を指定するとクラッシュします。これらは 2 つのコンストラクターでMyCalendarAdapterあるため、人々は何も問題がないように見えます。Fragment に移動しようとしたこのコードは、元は Activity からのものであり、完全に機能していたことを知っておくことも重要です。

public MyCalendarAdapter() {
    thisMonth = Calendar.getInstance();
    now = new MonthDisplayHelper(thisMonth.get(Calendar.YEAR), thisMonth.get(Calendar.MONTH));//creating Helper for month display
    currentDay = thisMonth.get(Calendar.DAY_OF_MONTH);//sets current day

    ...

}

public MyCalendarAdapter(int year, int month, int currentDay) {
    thisMonth = Calendar.getInstance();
    now = new MonthDisplayHelper(year, month);
    this.currentDay = currentDay;

    ...

}

エラーの完全なリスト:


11-08 18:26:35.710: E/AndroidRuntime(7839): FATAL EXCEPTION: main
11-08 18:26:35.710: E/AndroidRuntime(7839): java.lang.RuntimeException: Unable to start 
activity ComponentInfo{com.zeroe/com.zeroe.MainDisplayActivity}:   
android.view.InflateException: Binary XML file line #9: Error inflating class fragment
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at   
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.ActivityThread.access$600(ActivityThread.java:130)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.os.Handler.dispatchMessage(Handler.java:99)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.os.Looper.loop(Looper.java:137)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.ActivityThread.main(ActivityThread.java:4745)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
java.lang.reflect.Method.invokeNative(Native Method)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
java.lang.reflect.Method.invoke(Method.java:511)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at    
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
dalvik.system.NativeStart.main(Native Method)
11-08 18:26:35.710: E/AndroidRuntime(7839): Caused by: android.view.InflateException: 
Binary XML file line #9: Error inflating class fragment
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.inflate(LayoutInflater.java:489)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.inflate(LayoutInflater.java:396)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.inflate(LayoutInflater.java:352)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.Activity.setContentView(Activity.java:1867)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
com.zeroe.MainDisplayActivity.onCreate(MainDisplayActivity.java:60)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.Activity.performCreate(Activity.java:5008)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
11-08 18:26:35.710: E/AndroidRuntime(7839):     ... 11 more
11-08 18:26:35.710: E/AndroidRuntime(7839): Caused by: java.lang.NullPointerException
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
com.zeroe.MainDisplayFragment.onCreateView(MainDisplayFragment.java:80)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.FragmentManagerImpl.moveToState(FragmentManager.java:807)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1013)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1112)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.app.Activity.onCreateView(Activity.java:4664)
11-08 18:26:35.710: E/AndroidRuntime(7839):     at 
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
11-08 18:26:35.710: E/AndroidRuntime(7839):     ... 21 more

Fragment を設定する ActionBar 部分

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    Toast.makeText(this, "Position is "+itemPosition, Toast.LENGTH_SHORT).show();
    if(itemPosition == 0) {
        FragmentTransaction ft = getFragmentManager().beginTransaction();

        //check to see if one already exists and remove it
        Fragment prev = getFragmentManager().findFragmentByTag(MAIN_FRAGMENT);
        if(prev!=null) {
            ft.remove(prev);
            Toast.makeText(this, "Fragment was found", Toast.LENGTH_SHORT).show();
        }
        MyCalendarAdapter calendarAdapter = new MyCalendarAdapter(year, month, day);
        //Log.d("MAINDISPLAYACTIVTY", "calendarAdapter year is "+calendarAdapter.getCalendar().getYear());
        currentFragment = MainDisplayFragment.newInstance(this, year, month, day, calendarAdapter);
        ft.add((MainDisplayFragment)currentFragment, MAIN_FRAGMENT);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        //ft.addToBackStack(null); //i do not want this behavior
        ft.commit();
        return true;
    }
... continues on with the other cases

ActionBar を設定するアクティビティの onCreate

final ActionBar bar = getActionBar();
    bar.setDisplayShowTitleEnabled(false);
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    bar.setListNavigationCallbacks(new ArrayAdapter<String>(bar.getThemedContext(), android.R.layout.simple_list_item_1, android.R.id.text1,
                                                    new String[]{"MONTH", "WEEK", "DAY"}), this);

    if(savedInstanceState == null) {
        bar.setSelectedNavigationItem(0);
    } else {
        bar.setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_NAVIGATION_STATE));
    }
4

1 に答える 1

1

それで、私の問題が何であるかを理解しました。これは Fragments の Android ドキュメントではあまり明確ではありませんでした。<fragment/>main.xml ファイルでタグを使用していました。私はそれを正しく使用しており、フラグメントを作成するときにも正しく設定していました。残念ながら、期待していた動作が得られませんでした。

XMLでfragmentタグを使用するsetContentViewと、実行時にFragmentクラスもすぐに実行されることがわかります(少なくとも、ファイルを下っていくときにタグに遭遇したとき)。これが意味することは、フラグメントが起動元のアクティビティからの情報に依存している場合、フラグメントにはそれがなく、基本的に 2 回実行されるということです。setContentView が実行されるとき、および実際にフラグメントを実際に実行するとき。Fragment を実行するにはどちらの方法でも選択できると想定していたので、これは重要です。しかし実際には、アプリを設計する方法やアプリにアプローチする方法によって、フラグメントをハードコーディングするか、実際にオンザフライで実行するかが決まります。

これは Android の専門家には明らかだったかもしれませんが、私は Fragments を初めて使用するので、初歩的なミスだったと思います。どちらの場合も、これは Android のドキュメントで詳しく説明されているはずです。これが、問題について完全に混乱している他の誰かに役立つことを願っています。

于 2012-11-09T06:10:57.517 に答える