【问题标题】:Adding Assigned Values in Spinner NullPointerException在 Spinner NullPointerException 中添加赋值
【发布时间】:2013-12-18 20:01:24
【问题描述】:

就像我之前的帖子一样:Adding Integers from Different Fragments in a ViewPager

但是现在,我正在尝试在 FragA 的微调器中分配一个值并将其添加到 FragB 的 int 中。与上一篇文章一样,总和将在 FragC 上。这是我的代码:

FragA

public class FragA extends Fragment{ 

    Spinner spinner1;
    String s1; 

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

        spinner1 = (Spinner) getActivity().findViewById(R.id.spinner1);     
        spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {

                s1 = spinner1.getSelectedItem().toString();
                getInt(s1);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });     
        return inflater.inflate(R.layout.fraga, container, false);    
    }

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

        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);
    }

    public int getInt(String s1) {

        int a = 0;

        if(s1.equals("Hello")) {
            a = 5;
        }
        else if(s1.equals("Hi")) {
            a = 10; 
        }  

        return a;    
    }

}

FragB

public class FragB extends Fragment{

        int b = 20;

        public int getInt() {

            return b;
        }

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

            return inflater.inflate(R.layout.fragb, container, false); 
        }

    }

MainActivity

public class MainActivity extends FragmentActivity {

    ViewPager viewPager = null; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager)findViewById(R.id.pager);    
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));
    }

    public class MyAdapter extends FragmentStatePagerAdapter {  

            public MyAdapter (FragmentManager fm) {
                super(fm);
            }

            @Override
            public Fragment getItem(int i) {
                Fragment fragment = null;

                if (i == 0)
                {
                    fragment = new FragA();
                }
                if (i == 1)
                {
                    fragment = new FragB();
                }
                if (i == 2)
                {
                    fragment = new FragC(); 
                }
                return fragment;
            }

            @Override
            public int getCount() {
                return 3;
            }   
        }

    public String sum() {

        FragA FragA = new FragA();
        FragB FragB = new FragB();
        return Integer.valueOf(FragA.getInt() + FragB.getInt());
    }

}

FragC

public class FragC extends Fragment{

    Button button;
    TextView textView;

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

        View v = inflater.inflate(R.layout.fragc, container, false); 

        textView = (TextView)v.findViewById(R.id.textview);
        button = (Button)v.findViewById(R.id.button);
        button.setOnClickListener(Click);

        return v;
    }

    OnClickListener Click = new OnClickListener() { 

        @Override
        public void onClick(View v) {

            textView.setText(((MainActivity)getActivity()).sum());

        }
    };

}

MainActivity getInt() 出错,提示“FragA 类型中的方法 getInt() 不适用于 arguments()”

【问题讨论】:

  • FragA.java 的第 18 行有什么?
  • @Tamanna - String s1 = spinner1.getSelectedItem().toString();
  • spinner1 为 null 或 spinner1.getSelectedItem() 为 null
  • 您不能通过实例化该类来访问视图(Spinner)。我的意思是FragA FragA = new FragA(); 不包含微调器实例。只有当您的片段在前面时才能访问您的视图,否则它会返回空异常
  • @SathishKumar - 那我该怎么办?

标签: java android android-fragments nullpointerexception android-spinner


【解决方案1】:

把这一行放到onCreateView中

spinner1 = (Spinner) getActivity().findViewById(R.id.spinner1); 

【讨论】:

    【解决方案2】:

    ->spinner1 = (Spinner) getActivity().findViewById(R.id.spinner1);

    替换为

    Spinner spinner1 = (Spinner) getView().findViewById(R.id.spinner1);
    

    【讨论】:

      【解决方案3】:

      试试这个..

      onCreateView中使用它

             @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                  View view = inflater.inflate(R.layout.fraga, container, false); 
                  spinner1 = (Spinner) view.findViewById(R.id.spinner1);
                  ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
                  spinner1.setAdapter(adapter_a);
                  return view;
              }
      

      示例:

      public class FragA extends Fragment{
      
              Spinner spinner1;
      
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                 View view = inflater.inflate(R.layout.fraga, container, false); 
                  spinner1 = (Spinner) view.findViewById(R.id.spinner1);
                  ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
                  spinner1.setAdapter(adapter_a);
                  return view;
              }
      
              public int getInt() {
      
                  int a = 0;
      
                  String s1 = spinner1.getSelectedItem().toString();
      
                  if(s1.equals("Hello")) {
                      a = 5;
                  }
                  else if(s1.equals("Hi")) {
                      a = 10; 
                  }   
                  return a;       
              }
      
              public void onActivityCreated(Bundle savedInstanceState) {
                  super.onActivityCreated(savedInstanceState);
      
              }
      
          }
      

      【讨论】:

      • 我仍然在“String s1 = spinner1.getSelectedItem().toString();”处收到 NullPointerException ...
      • @user2942600 也在 onCreateView 内执行 setadapter 操作,就像我的编辑一样。
      • @user2942600 我检查了它是否正常工作。正确地,您在onActivityCreated 中的给予条目设置条目为时已晚。在设置条目之前,我们调用 spinner1.getSelectedItem().toString() 以便空指针。
      • 是的。 NullPointerException at "String s1 = spinner1.getSelectedItem().toString();"
      • @user2942600 是您的spinner1 布局中的fraga
      【解决方案4】:

      由于onActivityCreated 方法总是在onCreateView 之前调用,并且当您尝试初始化您的Spinner 时,它没有获得视图。

      onCreateView 中初始化你的Spinner

      已编辑:

      尝试通过为您的Spinner 实现setonItemClickListener 来获取您选择的项目,如下所示:

          String s1;
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
      
              spinner1 = (Spinner) getActivity().findViewById(R.id.spinner1);
      
              spinner1 .setOnItemSelectedListener(new OnItemSelectedListener() {
      
              @Override
              public void onItemSelected(AdapterView<?> arg0, View arg1,
                      int arg2, long arg3) {
                   s1 = spinner1.getSelectedItem().toString();
                                   getInt(s1);
              }
      
              @Override
              public void onNothingSelected(AdapterView<?> arg0) {
                  // TODO Auto-generated method stub
      
              }
          });
              return inflater.inflate(R.layout.fraga, container, false); 
      
          }
      

      还可以通过传递所选值的参数来更改getInt() 方法,如下所示。

       public int getInt(String s1) {
      
              int a = 0;
              if(s1.equals("Hello")) {
                  a = 5;
              }
              else if(s1.equals("Hi")) {
                  a = 10; 
              }   
              return a;       
          }
      

      【讨论】:

      • 仍然在“String s1 = spinner1.getSelectedItem().toString();”处获得 NPE
      • 我在 MainAcitivty “return Integer.toString(FragA.getInt() + FragB.getInt());”处遇到错误它说“FragA 类型中的方法 getInt() 不适用于 arguments()”
      • @user2942600 像这样尝试"return Integer.valueOf(FragA.getInt() + FragB.getInt());",如果你想返回String,那么将你的返回类型更改为String,比如return String.valueOf(FragA.getInt() + FragB.getInt());
      • 或者,如果您只想返回Integer,则需要将sum 方法的返回类型更改为String,例如public int sum() {......
      • 当我把它改成“return Integer.valueOf(FragA.getInt() + FragB.getInt());”或“返回 String.valueOf(FragA.getInt() + FragB.getInt());”它在 getInt() 处出现错误,说“FragA 类型中的方法 getInt() 不适用于 arguments()”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多