【问题标题】:Cannot make a static reference to the non-static method findViewById(int) from the type View无法从 View 类型对非静态方法 findViewById(int) 进行静态引用
【发布时间】:2014-05-15 12:30:23
【问题描述】:

我在代码行中收到以下错误:

无法从 View 类型对非静态方法 findViewById(int) 进行静态引用

mspinner        = (Spinner) View.findViewById(R.id.spinnervdc);

代码行也出现以下错误

构造函数 ArrayAdapter(ListViewFragment, int, String[]) 未定义

adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,name);

我的 MainActivity 是

package com.yogeshojha.nagariksahayata;
import java.util.ArrayList;
import java.util.List;

import com.yogeshojha.nagariksahayata.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.app.Activity;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class ListViewFragment extends Fragment implements OnItemSelectedListener{
public ListViewFragment(){}
Spinner mspinner; //declare spinner globally
ArrayAdapter<String> adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_listview, container, false);

mspinner        = (Spinner) View.findViewById(R.id.spinnervdc);
//set adapter for spinner here
String [] name = {"A","B","C"};
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,name);
// you can use getActivity() or this 

mspinner.setAdapter(adapter);

return rootView;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
    long id) {

//do something when particular item is selected from spinner

}

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

}
}

【问题讨论】:

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


    【解决方案1】:

    您不应该使用 View。相反,请使用 rootView。

    mSpinner = (Spinner) rootView.findViewById(R.id.spinnervdc);
    

    更新

    您的类扩展了 Fragment 类,而不是 Activity 类。因此,当您使用 this 时,会导致您提到的第二个错误。

    您需要将活动作为参数提供给 arrayadapter 构造函数;正如 Raghunandan 所建议的那样。

    adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,name);
    

    更新 2

    这可能对遇到类似错误的其他人有所帮助。除了查看类引用之外,您无法从其他任何事情中受益。

    这里,in the document, 表示第一个参数必须是上下文。您的方式不包含在构造函数的任何重载版本中。这就是你得到 undefined constructor 错误的原因。

    【讨论】:

      【解决方案2】:

      试试这个方法

      mspinner = (Spinner) rootView.findViewById(R.id.spinnervdc);
      

      而不是

      mspinner = (Spinner) View.findViewById(R.id.spinnervdc);
      

      您的Spinner 来自rootView layout,因此您需要使用该特定布局对其进行初始化。

      你也应该改变这个

      adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,name);
      

      与

      adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,name);
      

      【讨论】:

      • @YogeshOjha 使用 getActivity() 而不是 this。 this 不是有效的上下文
      【解决方案3】:

      除了已经建议的答案

      mspinner= (Spinner)rootView.findViewById(R.id.spinnervdc);
      

      正如错误所说

      构造函数 ArrayAdapter(ListViewFragment, int, String[]) 是 未定义

      this 指的是ListViewFragment,它扩展了Fragment。你需要一个有效的上下文。所以使用getActivity()。

      这个

      adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,name);
      

      应该是

      adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,name); 
      

      【讨论】:

        【解决方案4】:

        你正在引用

        View **rootView** = inflater.inflate(R.layout.fragment_listview, container, false);
        

        您必须访问此参考中的所有小部件,如下所示。

        mspinner = (Spinner) rootView .findViewById(R.id.spinnervdc);
        

        【讨论】:

          【解决方案5】:

          你应该改变:

          adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,name);
          

          到

          adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,name);
          

          【讨论】:

            【解决方案6】:

            试试这个,

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_listview, container, false);
            
            mspinner        = (Spinner) rootView.findViewById(R.id.spinnervdc);
            //set adapter for spinner here
            String [] name = {"A","B","C"};
            adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,name);
            
            
            mspinner.setAdapter(adapter);
            
            return rootView;
            }
            

            【讨论】:

              【解决方案7】:

              findViewByID() 不是静态方法,所以你不能这样调用它试试这个
              mSpinner = (Spinner) rootView.findViewById(R.id.spinnervdc);

              为此adapter=new ArrayAdapter&lt;String&gt;(this,android.R.layout.simple_spinner_item,name); 试试这个adapter=new ArrayAdapter&lt;String&gt;(getActivity(),android.R.layout.simple_spinner_item,name);

              希望这会奏效

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-07-20
                • 1970-01-01
                • 1970-01-01
                • 2013-01-15
                • 2015-08-18
                • 1970-01-01
                • 1970-01-01
                • 2012-07-14
                相关资源
                最近更新 更多