Android 使用onclicklistener时的内部类问题

Android 使用onclicklistener时的内部类问题,android,inner-classes,Android,Inner Classes,我经常遇到这样的问题:变量是从内部类访问的 每次我想从onclicklistener等使用对象时 我知道问题是它没有设置为final,但是如果我设置为final,在按下onclicklistener按钮之前,我无法对它做任何事情 例如,我有一个EditText字段,其中填充了一个对象的getText,然后我想按一个apply按钮,然后使用textfield中的新文本创建对象 当“内部类”需要使用最终对象时,这不起作用 我该如何处理这件事?我一直碰到这个该死的怪人 public class Edi

我经常遇到这样的问题:变量是从内部类访问的 每次我想从onclicklistener等使用对象时

我知道问题是它没有设置为final,但是如果我设置为final,在按下onclicklistener按钮之前,我无法对它做任何事情

例如,我有一个EditText字段,其中填充了一个对象的getText,然后我想按一个apply按钮,然后使用textfield中的新文本创建对象

当“内部类”需要使用最终对象时,这不起作用

我该如何处理这件事?我一直碰到这个该死的怪人

public class EditPicture extends Activity{

private EditText text;
private Button applyBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    UUID itemID = (UUID)getIntent().getSerializableExtra("itemUUID");
    PictureItem pi = new PictureItem("","");

    final ArrayList<PictureItem> tempArray = PictureTalkFragment.array;
    for(int i = 0; i < tempArray.size(); i++){
        if(itemID.equals(tempArray.get(i).getId())){
            pi = tempArray.get(i);
            tempArray.remove(i);
        }
    }

    setContentView(R.layout.picturetalk_edit_pic);
    text = (EditText)findViewById(R.id.editName);
    text.setText(pi.getTitle());
    applyBtn = (Button)findViewById(R.id.applyChangeBtn);
    applyBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tempArray.add(pi);
        }
    });


}
public类EditPicture扩展活动{
私人编辑文本;
专用按钮applyBtn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
UUID itemID=(UUID)getIntent().getSerializableExtra(“itemUUID”);
PictureItem pi=新PictureItem(“,”);
final ArrayList tempArray=PictureTalkFragment.array;
对于(int i=0;i

}问题在于,您将图片添加到临时数组中,而当您单击该临时数组时,该临时数组不可访问。我认为可以这样做,在inCreate函数之外定义数组

public class EditPicture extends Activity{

private EditText text;
private Button applyBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    UUID itemID = (UUID)getIntent().getSerializableExtra("itemUUID");
    PictureItem pi = new PictureItem("","");

    final ArrayList<PictureItem> tempArray = PictureTalkFragment.array;
    for(int i = 0; i < tempArray.size(); i++){
        if(itemID.equals(tempArray.get(i).getId())){
            pi = tempArray.get(i);
            tempArray.remove(i);
        }
    }

    setContentView(R.layout.picturetalk_edit_pic);
    text = (EditText)findViewById(R.id.editName);
    text.setText(pi.getTitle());
    applyBtn = (Button)findViewById(R.id.applyChangeBtn);
    applyBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(PictureTalkFragment.array != null){
               PictureTalkFragment.array.add(pi);
            }
        }
    });


}
}
public类EditPicture扩展活动{
私人编辑文本;
专用按钮applyBtn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
UUID itemID=(UUID)getIntent().getSerializableExtra(“itemUUID”);
PictureItem pi=新PictureItem(“,”);
final ArrayList tempArray=PictureTalkFragment.array;
对于(int i=0;i
您应该在
onCreate
方法之外定义
tempArray
变量

public class EditPicture extends Activity{

private EditText text;
private Button applyBtn;

ArrayList<PictureItem> tempArray

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    UUID itemID = (UUID)getIntent().getSerializableExtra("itemUUID");
    PictureItem pi = new PictureItem("","");

    tempArray = PictureTalkFragment.array;

    for(int i = 0; i < tempArray.size(); i++){
        if(itemID.equals(tempArray.get(i).getId())){
            pi = tempArray.get(i);
            tempArray.remove(i);
        }
    }

    setContentView(R.layout.picturetalk_edit_pic);
    text = (EditText)findViewById(R.id.editName);
    text.setText(pi.getTitle());
    applyBtn = (Button)findViewById(R.id.applyChangeBtn);
    applyBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tempArray.add(pi);
        }
    });


}
}
public类EditPicture扩展活动{
私人编辑文本;
专用按钮applyBtn;
数组列表临时数组
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
UUID itemID=(UUID)getIntent().getSerializableExtra(“itemUUID”);
PictureItem pi=新PictureItem(“,”);
tempArray=PictureTalkFragment.array;
对于(int i=0;i
onCreate
方法中定义变量
tempArray
。谢谢,这解决了内部类问题。从现在起,如果要在这些重写方法之外拥有这样的函数:),那么从另一个类获取Arraylist仍然存在问题。猜我在调用一个未创建的PictureTalkFragment(我的类不知道该实例)。我想知道如何处理它。请接受我的回答:)我不明白你的其他问题。问另一个问题以获得进一步帮助。Thumbsup:)将创建新的。我通过清理oncreate并将所有这些函数移出,解决了内部类的问题,如上面所建议的那样。不知道它是否能完全工作,但会导致我在ArrayList tempArray=PictureTalkFragment.array上的nullpoint出现问题;我在另一个类中添加了getter和setter方法,甚至公开了arraylist。但它总是以零点异常结束。基本上,我从一个类调用一个arraylist,这个类不知道它的实例。但是我只是想了解我应该如何/在哪里获得对allread创建实例的引用。当您将PictureTalkFragment中的静态元素数组提供给EditPicture时,请检查该数组是否不为null。