2016-10-24 4 views
0

Android Studioに関する問題を解決しようとしていますが、私は週末の大半で頭を悩ませました。割り当ては、ユーザーがオーバーヘッドバーのボタンをクリックしたときに更新されるリストフラグメントを作成することですが、最善の努力をしてもフラグメントの1つのみが実際に表示されます(ユーザーがどのボタンをクリックしても同じです)。私は問題をコンストラクタがバンドルを扱うことと関係があると確信しているところまで絞り込んだが、どこにエラーがあるのか​​分からない。後でAndroid Studioがフラグメントバンドルの一部として引数を保存できません

public static ItemFragment newInstance(String title, int position) { 
    ItemFragment fragment = new ItemFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1,title); 
    args.putInt(ARG_PARAM2,position); 
    fragment.setArguments(args); 
    return fragment; 
} 

そして、getArgumentsへの呼び出し():

public void onCreate(Bundle savedInstanceState) { 
    setRetainInstance(true); 
    if (getArguments() != null) { 
     mTitle=getArguments().getString(ARG_PARAM1); 
     mPosition=getArguments().getInt(ARG_PARAM2); 
     getActivity().setTitle(mTitle); 
    } 

     if (mPosition == 0) { 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, listItems)); 
    } else if (mPosition == 1) { 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, newGoalItems)); 
    } else if (mPosition == 2) { 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, markProgressItems)); 
    } else if (mPosition == 3) { 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, settingsItems)); 
    } 
} 

これはMainActivityの関連コードは次のとおりです。ここでは、関連するコードです

public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_list) { 
     list=ItemFragment.newInstance("List", 0); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.add(R.id.list_frame, new ItemFragment()); 
     fragmentTransaction.commit(); 
    } 
    else if (id==R.id.action_newGoal) { 
     newGoal=ItemFragment.newInstance("New Goal", 1); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.add(R.id.list_frame, new ItemFragment()); 
     fragmentTransaction.commit(); 
    } 
    else if (id==R.id.action_markProgress) { 
     markProgress=ItemFragment.newInstance("Mark Progress", 2); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.add(R.id.list_frame, new ItemFragment()); 
     fragmentTransaction.commit(); 
    } 
    else if (id==R.id.action_settings) { 
     settings=ItemFragment.newInstance("Settings", 3); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.add(R.id.list_frame, new ItemFragment()); 
     fragmentTransaction.commit(); 
    } 

    return super.onOptionsItemSelected(item); 
} 

私はテストから知っています上記のif文によってコードがクラッシュするだけです。私が知らないのはなぜでしょう... nullを返すことを防ぐgetArgumentsにいくつかの値があるように見えます。

+0

あなたのコードは私には正しいと思われます..あなたはどこであなたのgetArguments()を呼び出しましたか? –

+0

'getArguments'メソッドはどのように見えますか? – BlackHatSamurai

+0

問題を識別するのに十分なコードがありません。 – Karakuri

答えて

0

私はこれを最終的に見つけました!だから問題は、フレーム(コードの第3セクション)にフラグメントをロードするプロセス中に、教授は私たちがちょうど数行を作成したものを使用せずに新しいフラグメントをインスタンス化するコード行を私たちに与えた上記。私は単に

fragmentTransaction.add(R.id.list_frame, list); 

fragmentTransaction.add(R.id.list_frame, new ItemFragment()); 

を交換し、今ではすべてが実行されます。みんな助けてくれてありがとう!

0

書き込みフラグメントのコードのこの部分のonCreate()メソッドは、このラインItemFragmentフラグメント=新しいItemFragment()

if (getArguments() != null) { 
    mTitle=getArguments().getString(ARG_PARAM1); 
    mPosition=getArguments().getInt(ARG_PARAM2); 
    getActivity().setTitle(mTitle); 
    } 
+0

これは、コードが既に存在する場所です... –

+0

タグはXMLにありますか?Javaコードを呼び出すのではなくフラグメントのonCreate()が最初に呼び出されるため、引数を設定しないためです。xmlからフラグメントタグを削除してみてください – Noveen

+0

XMLにフラグメントタグはありません。この変数は手動で変数を設定するとうまく調整されるため、このJavaファイルにあると思います。問題を引き起こすリスト選択に基づいて動的に設定するだけです。 –

0
public static Fragment newInstance(String title, int position) { 
    Fragment fragment = new ItemFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1,title); 
    args.putInt(ARG_PARAM2,position); 
    fragment.setArguments(args); 
    return fragment; 
} 

変更を動作します。このフラグメントへのフラグメント=新しいItemFragment();すべてのコードが完璧です。

+0

私はこれを試しましたが、これは行リターンフラグメントに問題を引き起こします。 –

+0

次に、ItemFragmentメソッドの代わりにnewInstanceメソッドの戻り値の型を変更します。Fragment.pleaseのみを使用して、更新されたソリューションを確認してください。 – LoveAndroid

0

Fragmentのコンストラクタの引数を読み込もうとしているようです。コンテキストはコンストラクタではまだ確立されていないので、onCreate()メソッドでバンドルから読み込む必要があります。

+0

申し訳ありませんが、状況をよく説明しませんでした...読み込みはonCreate()メソッドで既に発生するように設定されています。それが役に立ったらコードの大部分を追加しました –

+0

あなたがしていることはすべて私によく見えます。あなたは "setRetainInstance(true);をコメントアウトしようとしましたか?それが何かに影響を与えているかどうかを確認する – AtlasRider

+0

ええ、でも効果はありませんでした... –

関連する問題