java - 函数返回时成员变量为 null

标签 java android null

可能重复,但不适用于我的示例: here

我有两个成员变量mSelectedOrderItem和mSelectedOrderItemId,它们都未初始化,因此为空。 (如果我在 onCreate 中将它们分配为空,仍然不起作用)。还有一个 ArrayList mOrderList。

在我的 ListView 中,如果您选择一个项目,这些变量就会被分配与该项目相对应的值。

然后我想在另一个方法 onClick 中使用这些分配的值,但 onClick 总是将 mSelectedOrderItem 视为 null,无论它是否在 onItemClick 中初始化,我不明白为什么。

import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class MenuFragment extends Fragment {

public static String TAG = "MenuFragment";
public static final String TITLE= "Menu";
private FragmentTabHost mTabHost;
private ListView mOrderListView;
private ArrayList<OrderItem> mOrderList;
private ArrayAdapter<OrderItem> mOrderListAdapter;
private OrderItem mSelectedOrderItem;
private Integer mSelectedOrderItemId;

/**
 * Returns a new instance of MenuFragment for managing fragments
 * 
 * @return a new instance of MenuFragment
 */
static MenuFragment newInstance() {
    return new MenuFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.menu_fragment, container, false);

    // Set up the inner food/drink tabs
    mTabHost = (FragmentTabHost) layout.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.menu_items_fragment_container);
    mTabHost.addTab(mTabHost.newTabSpec("food").setIndicator(FoodItemsFragment.TITLE), FoodItemsFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("drinks").setIndicator(DrinkItemsFragment.TITLE), DrinkItemsFragment.class, null);

    // Set up the list view
    mOrderListView = (ListView) layout.findViewById(R.id.ordered_items);
    mOrderList = new ArrayList<OrderItem>();
    mOrderList.add(new OrderItem("First item"));
    mOrderList.add(new OrderItem("Second item"));
    mOrderList.add(new OrderItem("Third item"));
    mOrderList.add(new OrderItem("Fourth item"));

    // Set the array adapter to the list view to display the contents of the standing order list
    mOrderListAdapter = new ArrayAdapter<OrderItem>(getActivity(), android.R.layout.simple_list_item_1, mOrderList);
    mOrderListView.setAdapter(mOrderListAdapter);

    return layout;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // Set up the List View so that, when clicked, its details are shown in the details section
    // Set what happens when an item in the view is clicked
    mOrderListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            // Identify the element of the order list
            // Since the list positions and the array positions are the same
            // i.e. first position in the list corresponds to mOrderList.get(0)
            // use that knowledge
            mSelectedOrderItem = mOrderList.get(position);
            mSelectedOrderItemId = position;

            // Set the text of the details section
            // Would it be worth storing these as member variables since they're likely to be accessed
            // a lot?
            ((TextView) getActivity().findViewById(R.id.order_name)).setText(mSelectedOrderItem.getItemName());
            ((EditText) getActivity().findViewById(R.id.order_note)).setText(mSelectedOrderItem.getItemNote());

        }
    });

    // Set what happens when the delete button is pressed
    ((Button) getActivity().findViewById(R.id.delete_button)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {

            // If there's no item currently selected, do nothing
            if (mSelectedOrderItem == null) {
                Log.d(TAG, "mSelectedOrderItem == null");
                return;
            }

            mOrderList.remove(mSelectedOrderItem);
            mOrderListAdapter.notifyDataSetChanged();

        }

    });

}
}

有什么想法吗?

干杯。

编辑:添加了整个类代码。

最佳答案

只需添加 Log.i("Fragment","mSelectedOrderItemId = "+ mSelectedOrderItemId);在你的

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

如果从该方法调用它并具有正确的值,请在其他地方找到解决方案。

关于java - 函数返回时成员变量为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22535252/

相关文章:

java - 将短美国日期解析为 yyyy-MM-dd,java

java - 如果子查询的结果集列值为 NULL,则显示某个值

mysql - 查找 MySQL 表中每一列的最后一个非 NULL 值?

java - #strings 和标准 String 方法之间的区别

java - 使用数组作为参数返回多个值是一种不好的做法吗

android - 带有可点击/可编辑小部件的 ListView

java - 恢复上一个 fragment onBackPressed()?

android - 如果您的应用程序具有设备管理员/设备所有者权限(未 Root ),如何杀死另一个应用程序

postgresql - 如何处理 pandas 数据帧整数列中的 NaN 到 postgresql 数据库

java - Swing JTextField 进行文本更改