android studio识别不出来明明应该有的方法addView(),代码见图,求大神看看可能是什么原因造成的

2024年12月04日 15:39
有2个网友回答
网友(1):

出现这个问题是因为题主试图在一个类的初始化域(Initializing Field)中进行除赋值及声明变量以外的操作,而这种操作在 Java 中是不允许的。通常一个 Java 公共类的结构如下:


public class Foo {
    
    // 这里叫做初始化域,用来声明一个类中的全局变量,此区域中只能进行
    // 赋值或声明新变量的操作,笼统一点说就是此区域中的代码必须是 
    // ImageView image = ...; 或者 ImageView image; 这种形式。
    // 题主的代码试图在此区域中调用 LinearLayout 的 addView 方法,却
    // 没有将其返回值赋予任何变量,所以会报错。
    int varOne = 3;
    private int varTwo = 3;
    public String varThree = "STR";
    protected String varFour = varThree.toString();
    int[] varFive = new int[] {3, 4, 5, 6};
    
    // 这个区块叫初始化块(Initializer Block),此区域中的所有代码会被
    // 复制到类的构造函数(下方)当中,所以此区域中可以进行方法的调用而不
    // 进行赋值。此区域是可有可无的。
    {
        varFour.toString();
    }
    
    // 这个区域叫做构造函数(Constructor),它是在该类对象被创建时第一个
    // 被调用的函数。构造函数的函数名需要与类名完全相同,且没有任何返回值,
    // (即连 void 也不会返回)。此函数的主要目的是初始化在初始化域中所定
    // 义的各种全局变量。构造函数不是必需的,如果没有此函数 Java 会自动
    // 继承父类的构造函数,如果没有父类 Java 会自动添加一个空的构造函数。
    public Foo(int a, String b, LinearLayout c) {
        this.varOne = a;
        ...
    }
    
    
    // 以下就是类的各种常规方法的定义了。
    private void methodOne() {
        ...
    }
    
    public void methodTwo() {
        ...
    }
    
    protected static String methodThree() {
        ...
    }
     
}


由上可见,如果想调用一个变量的方法,而不将其返回值赋予新的变量的话,必须在类的初始化块、构造函数或者各种方法中进行操作,而不能在其他地方。事实上,Android 的 Activity 类虽然没有定义构造函数,但提供了 onCreate 方法让你进行变量的初始化以及对变量的各种操作。onCreate 方法会在一个新的 Activity 对象建立后立即执行,所以题主应该将 addView 方法的执行移动到 onCreate 方法中,如下:


public class MainActivity extends AppCompatActivity {
    
    private int[] mImages = new int[] {
        R.drawable.image01,
        R.drawable.image02,
        R.drawable.image03
    };
    
    private int mCurrentImg = 0;
    private LinearLayout mLinearLayout;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mLinearLayout = (LinearLayout) findViewById(R.id.rest);
        ImageView imageView = new ImageView(this);
        mLinearLayout.addView(imageView);
    }

}

网友(2):

你将addview这个方法放到oncreate里面去执行