我知道之前曾问过这个问题,但我尝试了所有解决方案并获得错误
我在android studio上有两项活动......
第一个名为'MainActivity'并包含一个方法'deleteFromArrayList()' 这个名为'DeletButtonActivity'并包含一个方法'delete(View v)'
我想调用'deleteFromArrayList()'而没有创建另一个类或使方法静态....因为我在deleteFromArrayList()中有一个ArrayList
注意:我使用Intent发送要从数组列表中删除的索引值.. DeleteButtonActivity中的代码是 public void delete(查看对象){
try {
Intent i = new Intent(DeleteButton.this, MainActivity.class);
i.putExtra("index", (int) spinner2.getSelectedItemId());
(new MainActivity()).DeletButtonActivity();
Toast.makeText(getApplicationContext(), "it was deleted", Toast.LENGTH_SHORT).show();
}
catch(Exception e){
Toast.makeText(getApplicationContext(), e+"", Toast.LENGTH_SHORT).show();
}
}
和MainActivity中的代码
public void deleteFromArrayList (){
this.arrayList.remove(getIntent().getIntExtra("index",-1));
}
当我运行应用程序时,我得到一个错误NullPointerException ,,, 任何人都可以帮助我..请 希望我能很好地描述这个问题
答案 0 :(得分:0)
你不能这样做。有活动或片段之间进行通信的机制。
可以,使用startActivityForResult
,这是活动A调用活动B,然后在B中执行某些操作,并将结果传回活动A.
您可以根据需要使用其他解决方法。如果您可以访问两个活动中的数据,则可以在以太网中修改其中一个,当活动开始时,它将显示更新的数据。
请先阅读有关活动here的内容,并提供更多有关问题的背景信息。
答案 1 :(得分:0)
Android中的活动不仅仅是一个简单的课程,而且还有一个 Lifecycle :
活动基本上有四种状态:
如果活动位于屏幕的前景(位于屏幕的顶部) 堆栈),它是活动的还是正在运行的。如果一项活动失去了重点,但是 仍然可见(即,一个新的非全尺寸或透明的活动 它集中在你的活动之上),它被暂停了。
暂停的活动是 完全活着(它维护所有州和会员的信息和 仍然附在窗口管理器上),但可以被杀死 极端低内存情况下的系统。
如果活动完全 被另一项活动遮挡,它被停止了。它仍然保留所有 但是,状态和成员信息不再可见 用户所以它的窗口是隐藏的,它经常被系统杀死 在别处需要记忆的时候。
如果活动暂停或停止, 系统可以通过询问来从内存中删除活动 完成,或简单地杀死它的过程。再次显示时 用户必须完全重新启动并恢复到之前的状态 状态。
因此,代码的问题在于,当您想要在已停止的活动中访问数组时,之前使用的实例可能不再是 alive 。
如何解决问题
一种非常简单的方法是在从一个活动转换到另一个活动之前使用参数传递,为此你将数组作为intent extra传递然后你“通过使用onActivityResult() callback完成第二项活动后返回结果。
第二种方法可能是使用类似于Activity的Service,但它没有UI,并且它有自己的生命周期。即使你应用它也能活着。使用服务,您可以将数组保留在服务中,然后使用数组communicate进行常规操作。
第三种方法可能是使用EventBus。活动,片段,线程,服务之间非常简单的通信机制。 2015年Android Dev Summit上有一个名为Android Application Architecture的精彩演讲,它使用EventBus作为通信机制,并在REST Android App上实现MVC架构模式。
回到你的问题。如果您只需要在两个活动之间“共享”数组,请使用第一种方法。第二个和第三个只是不同替代方案的例子,你需要的不止这些。