Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数返回时的成员变量null_Java_Android_Null - Fatal编程技术网

Java 函数返回时的成员变量null

Java 函数返回时的成员变量null,java,android,null,Java,Android,Null,可能重复,但不适用于我的示例: 我有两个成员变量mSelectedOrderItem和mSelectedOrderItem,它们都未初始化,因此为空。(如果我在onCreate中为它们赋值为null,仍然不起作用)。还有一个ArrayList mOrderList 在我的列表视图中,如果您选择了一个项目,这些变量将被分配与该项目对应的值 然后,我想在另一个方法onClick中使用这些赋值,但onClick始终将mSelectedOrderItem视为null,而不管它是否在onItemClick

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

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

在我的列表视图中,如果您选择了一个项目,这些变量将被分配与该项目对应的值

然后,我想在另一个方法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();

        }

    });

}
}
import java.util.ArrayList;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentTabHost;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.LinearLayout;
导入android.widget.ListView;
导入android.widget.TextView;
公共类MenuFragment扩展了片段{
公共静态字符串TAG=“MenuFragment”;
公共静态最终字符串TITLE=“Menu”;
私有碎片选项卡主机mTabHost;
私有ListView mOrderListView;
私有阵列列表;
专用阵列适配器;
私有OrderItem mSelectedOrderItem;
私有整数mSelectedOrderItemId;
/**
*返回用于管理片段的MenuFragment的新实例
* 
*@返回MenuFragment的新实例
*/
静态MenuFragment newInstance(){
返回新的MenuFragment();
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
LinearLayout布局=(LinearLayout)充气器。充气(R.layout.menu_片段,容器,false);
//设置内部食品/饮料标签
mTabHost=(FragmentTabHost)layout.findviewbyd(android.R.id.tabhost);
mTabHost.setup(getActivity()、getChildFragmentManager()、R.id.menu\u items\u fragment\u container);
mTabHost.addTab(mTabHost.newTabSpec(“食品”).setIndicator(FoodItemsFragment.TITLE),FoodItemsFragment.class,null);
mTabHost.addTab(mTabHost.newTabSpec(“饮料”).setIndicator(DrinkItemsFragment.TITLE),DrinkItemsFragment.class,null);
//设置列表视图
mOrderListView=(ListView)layout.findViewById(R.id.ordered_items);
mOrderList=newarraylist();
添加(新订单项(“第一项”);
添加(新订单项(“第二项”);
添加(新订单项(“第三项”);
添加(新订单项(“第四项”);
//将阵列适配器设置为列表视图以显示长期订单列表的内容
mOrderListAdapter=newArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,mOrderList);
setAdapter(mOrderListAdapter);
返回布局;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//设置列表视图,以便在单击时,其详细信息显示在详细信息部分
//设置单击视图中的项目时发生的情况
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//确定订单列表的元素
//因为列表位置和数组位置是相同的
//即列表中的第一个位置对应于mOrderList.get(0)
//利用这些知识
mSelectedOrderItem=mOrderList.get(位置);
mSelectedOrderItemId=位置;
//设置详细信息部分的文本
//是否值得将它们存储为成员变量,因为它们很可能被访问
//很多?
((TextView)getActivity().findViewById(R.id.order_name)).setText(mSelectedOrderItem.getItemName());
((EditText)getActivity().findViewById(R.id.order_note)).setText(mSelectedOrderItem.getItemNote());
}
});
//设置按下删除按钮时发生的情况
((按钮)getActivity().findViewById(R.id.delete_按钮)).setOnClickListener(新OnClickListener()){
@凌驾
公共void onClick(视图){
//如果当前未选择任何项目,则不执行任何操作
如果(mSelectedOrderItem==null){
d(标记“mSelectedOrderItem==null”);
回来
}
删除(mSelectedOrderItem);
mOrderListAdapter.notifyDataSetChanged();
}
});
}
}
有什么想法吗

干杯

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

只需添加Log.i(“片段”,“mSelectedOrderItemId=“+mSelectedOrderItemId”);在你的

public void onItemClick(AdapterView<?> parent, View view, int position, long id)
public void onItemClick(AdapterView父视图、视图视图、整型位置、长id)

如果它将从这个方法调用并具有正确的值,请在其他位置找到解决方案。

我已经找到了问题的解决方案,但不一定是问题的答案

我将整个代码体移到了onCreateView方法中,而不是onActivityCreated方法中的片段,因为我突然意识到它仍在处理创建接口的问题,所以它在逻辑上属于onCreateView方法,瞧,它突然起作用了


有人知道这是为什么吗?

您在OnViewCreated中返回的布局中是否包含R.id.order\u name?我认为问题出在其他地方。离开McClick时,该字段不为空,否则您将获得NPE。onClick的第一部分是空检查。是的,在OnItemClick中完全可以,只是在onClick中总是空的。我不明白为什么。这是一个动作中的一个片段