可能重复,但不适用于我的示例: 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/