簡體   English   中英

如何顯示特定列表項的警報對話框

[英]How to show alert dialog for certain list item

每當我選擇一個特定的列表項時,我都會嘗試顯示一個警報對話框,而其他人會打開一個新的片段。 但是,在插入 alreat 對話框代碼后,將返回錯誤。 我不明白為什么當“意圖”已經被初始化時我會收到這個錯誤。 可以做些什么來解決這個問題?

變量“意圖”可能尚未初始化

片段水果選擇器

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

不太確定你的程序是如何工作的,但是在你的第二個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。 我建議在實際調用startActivity()之前簡單地為意圖添加一個空檢查器,如下所示:

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

您可以為每個if / elif / else語句放置單獨的Intent intent = new Intent(...)以確保確定。 但這是你的代碼,所以你會怎么做。 :D 希望這會有所幫助。 祝你好運。 :)

試試 Intent intent = null; 而不是 Intent 意圖; 很難說,但我認為這應該可以解決您的問題 –

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM