2016-05-04 9 views
-2

Ich versuche, einen Alarmdialog zu zeigen, wenn ich ein bestimmtes Listenelement auswähle, während die anderen ein neues Fragment öffnen würden. Nach dem Einfügen des Alreat-Dialogfeldcodes wird jedoch ein Fehler zurückgegeben. Ich verstehe nicht, warum ich diesen Fehler bekomme, wenn 'Absicht' bereits initialisiert wurde. Was kann getan werden, um dieses Problem zu lösen?So zeigen Sie den Alarmdialog für bestimmte Listenelemente an

Variable 'Absicht' könnte nicht erreicht wurden

initialisiert

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); 
    } 
} 

Antwort

1

Nicht ganz sicher, wie Ihr Programm funktioniert, aber in Ihrer zweiten else if Anweisung, Ihre intent nicht initialisiert wird, noch startActivity(intent) wird noch genannt:

} 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); 

Sie könnten tun, was @seanAshmore geantwortet hat, aber es kann trotzdem zu einer NPE führen. Ich schlage vor, das Hinzufügen einfach eine Nullprüfung für die Absicht, bevor sie tatsächlich startActivity() Aufruf, etwa so:

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

Sie haben soeben getrennte Intent intent = new Intent(...) für jede if/elif/else Aussage nur um sicher zu sein, setzen könnten. Aber das ist dein Code, also tu das, was du willst. : D Hoffe das hilft irgendwie. Viel Glück. :)

+0

Was ist 'getSimpleName'? – MacaronLover

+0

Es erhält einfach den Namen der 'Aktivität'. Sie können die Protokolle ignorieren, die ich eingeschlossen habe. –

+0

Hat es funktioniert? Konnten Sie es reparieren? –

0

Versuche mal Intent Absicht = null; statt Absicht Absicht; Es ist schwer zu sagen, aber ich denke, dass Ihr Problem lösen soll -