2016-05-04 9 views
-2

特定のリストアイテムを選択するたびにアラートダイアログを表示しようとしていますが、他のアイテムは新しいフラグメントを開きます。しかし、対話ダイアログコードを挿入した後、エラーが返されます。私はなぜ '意図'が既に初期化されているときにこのエラーが出るのか分からない。この問題を解決するには何ができますか?特定のリストアイテムのアラートダイアログを表示する方法

変数 '意図は'

を初期化されていない可能性がありますFragmentFruitChooser

public class FragmentFruitChooser extends ListFragment { 

    public FragmentFruitChooser() { 
     // Required empty constructor 
    } 

    /** 
    * Whether or not the activity is in two-pane mode, i.e. running on a tablet 
    * device. 
    */ 
    public boolean mTwoPane; 

    public static FragmentFruitChooser newInstance() { 
     return new FragmentFruitChooser(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_fruit_chooser, container, false); 
     initialize(); 
     return view; 
    } 

    List<Fruits> list = new ArrayList<>(); 
    private void initialize() { 
     String[] items = getActivity().getResources().getStringArray(R.array.fruit_names); 
     String[] itemDescriptions = getActivity().getResources().getStringArray(R.array.fruit_descriptions); 
     for (int n = 0; n < items.length; n++){ 
      Fruit fruit = new Fruit(); 
      fruit.setID(); 
      fruit.setName(items[n]); 
      fruit.setDescription(itemDescriptions[n]); 
      list.add(fruit); 
     } 

     FruitListAdapter mAdapter = new FruitListAdapter(list, getActivity()); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     View v = getView(); 

     mTwoPane = getActivity().findViewById(R.id.detail_container) != null; 

     assert v != null; 
     ListView lv = (ListView)v.findViewById(android.R.id.list); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // get the adapter, then get the name from the adapter at that position 
       FruitListAdapter adapter = (FruitListAdapter) parent.getAdapter(); 

       //reverse the selected state in data model 
       for (int i = 0; i < adapter.getCount(); i++) { 
        Fruit fruit = (Fruit)adapter.getItem(i); 
        fruit.setSelected(i == position); 
       } 
       Fruit fruit = (Fruit)adapter.getItem(position); 

       if (!mTwoPane) { 

        Intent intent; 
        if (fruit.getFruit().equals(view.getResources().getString(R.string.apple))) { 
         intent = new Intent(getActivity(), FruitAppleActivity.class); 
        } else if (fruit.getFruit().equals(view.getResources().getString(R.string.orange))) { 
         intent = new Intent(getActivity(), FruitOrangeActivity.class); 
        } else if (fruit.getFruit().equals(view.getResources().getString(R.string.tomato))) { 
AlertDialog ad = new AlertDialog.Builder(getContext()) 
      .create(); 
    ad.setCancelable(false); 
    ad.setTitle("Seeded Fruit"); 
    ad.setMessage("This fruit contains seeds."); 
    ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
ad.show(); 
        } else { 
         intent = new Intent(getActivity(), FruitAppleActivity.class); 
        } 
        startActivity(intent); 
       } 
      } 

     }); 

     super.onActivityCreated(savedInstanceState); 
    } 
} 

答えて

1

あなたのプログラムがどのように機能するかをかなり確実ではないが、あなたの第二else if声明の中で、あなたのintentが初期化されていない、まだstartActivity(intent)がまだ呼び出されます。

} else if (fruit.getFruit().equals(view.getResources().getString(R.string.tomato))) { 
         AlertDialog ad = new AlertDialog.Builder(getContext()) 
           .create(); 
         ad.setCancelable(false); 
         ad.setTitle("Seeded Fruit"); 
         ad.setMessage("This fruit contains seeds."); 
         ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           dialog.dismiss(); 
          } 
         }); 
         ad.show(); 
        } else { 
         intent = new Intent(getActivity(), FruitAppleActivity.class); 
        } 

        startActivity(intent); 

あなたは@seanAshmoreが答えたことをすることができますが、それでもNPEになる可能性があります。

if (intent != null) { 
         startActivity(intent); 
        } else { 
         Log.d(FragmentFruitChooser.class.getSimpleName(), "Intent is null"); 
        } 

あなたはただ単に確認するために、各if/elif/else文のIntent intent = new Intent(...)別々に置くことができる:私は単純にそうように、実際にstartActivity()を呼び出す前に、目的のためにヌルチェッカーを追加することをお勧めします。しかし、あなたのコードはそうです。 :Dこれは何とか役立ちます。がんばろう。 :)

+0

「getSimpleName」とは何ですか? – MacaronLover

+0

単に 'Activity'の名前を取得します。あなたは私が含むログを無視することができます。 –

+0

それは機能しましたか?あなたはそれを修正することができましたか? –

0

はジャスト・インテントの意図= nullをしてみてください。意図の意図の代わりに。それは伝えるのは難しいのですが、私はそれはあなたの問題を解決すべきだと思う -

関連する問題