最終更新
問題がすべて間違っていたことがわかりました。Fragmentタグの使い方でした。完全な説明を得るには、以下の私の回答を参照してください。
更新 3 : そのため、何時間もいじり続けてきましたが、そのような運はありませんでした。クラッシュしないところまで到達することができました。しかし今、私は問題が何であるかを知っていると信じています. calendarAdapter
nullだったので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));
}