-1

错误:公共类型 TodoListItemView 必须在其自己的文件中定义。(行public class TodoListItemView extends TextView {:)

    package com.kisinivan.todolist;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          ListView myListView = (ListView)findViewById(R.id.myListView);
          final EditText myEditText = (EditText)findViewById(R.id.myEditText);
          final ArrayList<String> todoItems = new ArrayList<String>();
        final ArrayAdapter<String> aa;
        aa = new ArrayAdapter<String>(this,
                                      android.R.layout.simple_list_item_1,
                                      todoItems);
        myListView.setAdapter(aa);
           myEditText.setOnKeyListener(new OnKeyListener() {
             public boolean onKey(View v, int keyCode, KeyEvent event) {
               if (event.getAction() == KeyEvent.ACTION_DOWN)
                 if (keyCode == KeyEvent.KEYCODE_ENTER){
                   todoItems.add(0, myEditText.getText().toString());
                   aa.notifyDataSetChanged();
                   myEditText.setText("");
                   return true;
                 }
               return false;
        } });
        }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

public class TodoListItemView extends TextView {
      public TodoListItemView (Context context, AttributeSet ats, int ds) {
        super(context, ats, ds);
        init();
    }
      public TodoListItemView (Context context) {
        super(context);
        init();
    }
      public TodoListItemView (Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
      private void init() {
      }
      @Override
      public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
      }
    }
4

3 回答 3

3

Eclipse 正在应用一个可选的(但非常常见的)限制。来自 Java 语言规范,第 7.6 节

当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,则主机系统可能会选择强制执行它是编译时错误的限制如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码中访问)。

修复很简单......其中之一:

  • 将课程设为非公开
  • 使其成为嵌套类型(例如 within MainActivity
  • 将它放在自己的文件中,名称与类的名称匹配

除非您要嵌套它,否则即使您也将其设为非公开,我也会将其移动到自己的文件中。

于 2013-01-16T18:07:56.047 回答
0

Eclipse 不喜欢你创建一个类,除非它有自己的文件。只需制作另一个名为 TodoListItemView 的文件并将您的课程放在那里。或者,如果您仅在一项活动中使用该类,则可以将其设为私有。

感谢 Jon skeet,我现在知道你也可以这样做

如果你想要一个公共课程,你仍然可以通过将它放在你的活动中来制作一个

于 2013-01-16T18:05:21.917 回答
0

不同的类需要在自己的文件中定义。在同一个文件中定义两个类是行不通的。

于 2013-01-16T18:06:02.717 回答