首页 > 解决方案 > 在类方法中删除视图

问题描述

在我的活动中,我尝试从一个类中调用一个方法,但它没有得到正确的值。这是活动二:

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();

这是带有方法的类(事件):

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。所以我的问题是,为什么我的类方法中的 View 为 null,而我从我的 activityTwo 传递了正确的 LinearLayout?

id 是从哪里来的?

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

应用流程:

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

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)

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

标签: javaandroidandroid-studioandroid-linearlayoutcardview

解决方案


好吧,因为您没有分享id值的来源(意图从哪里获取数据/您如何将值放入其中/值来自哪里),所以我假设了这个解决方案:

  • 每当我使用带有 View Ids 的“switch”语句时,它都会告诉我一个非常重要的警告,即

资源 ID 在 Android Gradle 插件 5.0 版中将是非最终的,请避免在 switch case 语句中使用它们

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

  • 我猜在您的情况下,当您获得事件视图的 id然后膨胀布局视图时,膨胀过程涉及更改事件视图的“int”id 值,因此每当您查询旧 id 时,它会返回 null,因为事件视图膨胀的布局视图内部现在有一个新的 'int' id 值。

  • 我不知道为什么它在主要活动中起作用,因为您没有共享从中获取 id 的完整代码。

  • 所以我想唯一的解决方案是你应该找到一种方法来获取 id 的新副本,然后在方法中扩展要处理的视图。

更新

问题在于,
View mainActivity = inflater.inflate(R.layout.activity_main, null);
每次你扩充一个新的布局视图时,这个代码块都会认为你有主活动使用的那个,但是你正在创建一个带有新视图和新 ID 的全新视图。
这就是为什么您可以在主要活动中获得视图但无法从新膨胀的视图中获得它的原因。

更新

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

整个情况的更好实现是使用房间而不是静态数组将这些事件存储在数据库中,这样您就可以随时使用一行代码删除/添加/编辑任何事件,如果您愿意这样做您可以从阅读room的开发人员文档开始。


推荐阅读