在 class 方法中删除视图

Deleting a View in a class method

在我的 activity 中,我尝试从 class 调用一个方法,但它没有获得正确的值。 这是Activity两个:

int id = intent.getIntExtra("id", 0);
LayoutInflater inflater = getLayoutInflater();
View mainActivity = inflater.inflate(R.layout.activity_main, null);

LinearLayout eventsLayout = mainActivity.findViewById(R.id.eventsLayout);
Log.d("ACTIVITY_eventlayout", String.valueOf(eventsLayout)); // gives the layout perfectly
Event.RemoveSpecific(eventsLayout, id);

finish();

这是class(事件)方法:

public static void RemoveSpecific(LinearLayout layout, int id){
        View event = layout.findViewById(id);
        Log.d("INSIDE_removespecific", String.valueOf(event));// event is null
        layout.removeView(event);
}

在我的 MainActivity 中工作正常:

LinearLayout eventsLayout = findViewById(R.id.eventsLayout);
View event = eventsLayout.findViewById(id);
//Log.d("MAIN_event", String.valueOf(event1)); // gives it perfectly
eventsLayout.removeView(event);

我还在我的 MainActivity 中添加了这个视图,并使用 .setId(id) 给它正确的 ID。所以我的问题是,为什么我的 class 方法中的视图为空,而我从 activityTwo 传递正确的 LinearLayout?

id从哪里来?

我有事件 class,其中包含 ID、名称、日期和描述。这个 class 还有一个名为 eventsList 的静态 ArrayList。每当用户创建新提醒时,我都会使用我的 class 创建一个新事件并将其 ID 设置为 Event.eventsList().size() (将其添加到我的事件列表后 [因此第一个事件 ID 始终为 1]),然后我创建了一个新视图并传递最近创建的事件详细信息并使用 setId() 为其指定一个 ID [1]。然后在这个视图中,我有一个按钮,它有一个 onClickListener,它将给定的视图 ID 和 LinearLayout(添加视图的位置)传递给我的 Event.removeSpecific() 方法。

应用流程:

用户点击 MainActivity 中的一个按钮来创建一个事件,然后点击按钮然后使用 startActivityForResult() 以打开一个新的 Activity 用户输入的地方事件的名称、描述和日期,然后我使用 putExtra() 方法创建一个意图,然后使用 setResult(RESULT_OK, resultintent) 将数据发送回 MainActivity。现在,当 MainActivity 取回数据时,我使用 .getStringExtra() 使用数据创建一个新的事件对象并将其添加到可能 Event.eventsList ArrayList,然后我使用以下内容:

LayoutInflater inflater = getLayoutInflater();
View event_Exmaple = inflater.inflate(R.layout.event_example, null);

并用我得到的数据设置 textView,并使用 event_example.setId(Event.eventsList.size()) 给它一个 id。 之后,我将其添加到我的 LinearLayout(我已经在 MainActivity 中声明):

eventsLayout.addView(event_example)

现在我提到事件 class 有一个日期字段。我用它来设置 AlarmManager 的警报。使用 AlarmManager,我通过意图发送当前事件对象的数据,当用户收到通知时,它会打开一个新的 Activity,它获取给定的事件对象数据(带有 intent.putExtra()),这就是用户点击按钮的部分。我想从 MainActivity XML.

中的 LinearLayout 中删除给定 Event 对象的视图

好吧,因为你没有分享 id 值的来源(从意图获得其 data/how 的地方,你将值放在 it/where值来自),我假设这个解决方案:

  • 每当我使用带有视图 ID 的 'switch' 语句时,它都会告诉我一个非常重要的警告,即

Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them in switch case statements

  • 这意味着视图 ID 在某些情况下没有稳定的 ID,您不应将它们视为最终 ID。

  • 我想在你的情况下,当你得到一个 id 到你的 事件视图 然后膨胀 布局视图 ,膨胀过程涉及更改 事件视图 的 'int' id 值,因此每当您查询旧 id 时,它 returns null 自 事件膨胀的 布局视图 中的视图 现在有一个新的 'int' id 值。

  • 我不知道为什么它在 main activity 中有效,因为您没有共享从中获取 ID 的完整代码。

  • 所以我想唯一的解决办法是你应该找到一种方法来在你膨胀你想要在方法中处理的视图之后获取 id 的新副本。

更新

问题出在这段代码上
View mainActivity = inflater.inflate(R.layout.activity_main, null);
每次你膨胀一个新的布局视图时,认为你有 main activity 使用的布局视图,但实际上你正在创建一个具有新视图和新 ID 的全新布局视图。
这就是为什么您可以在主 activity 中获得视图,但不能从新膨胀的视图中获得它。

更新

如果您需要使用 id 删除此项目并将静态数组存储在视图自定义 class 中,请对静态数组调用 getter 并从中删除项目,而不是试图删除视图本身。

对整个情况的更好实现是使用 room 而不是静态数组将这些事件存储在数据库中,这样你就可以 delete/add/edit 任何时间只用一行代码的任何事件,如果你'如果您愿意这样做,您可以先阅读房间的开发人员 documentation