我在MainActivity中有2个无线电组,如下所示:
public class MainActivity extends AppCompatActivity {
public static RadioGroup tapRadioGroup, timeRadioGroup;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tapRadioGroup = findViewById(R.id.finger_radio_group);
timeRadioGroup = findViewById(R.id.time_radio_group);
...
}
}
我希望将它们引用到另一个活动中的2个方法,如下所示:
public void getTapCheckedOption() {
RadioGroup radioGroup = MainActivity.tapRadioGroup;
...
}
public void getTimeCheckedOption() {
RadioGroup radioGroup = MainActivity.timeRadioGroup;
...
}
这一切都很好并且正在运行,但问题是当我在2个无线电组上声明静态时,有一个警告说练习会导致内存泄漏。但是,如果我没有声明它,我就不能在其他活动中调用MainActivity.tapRadioGroup
。那么如果没有警告信息我怎么能正确地做到?
答案 0 :(得分:4)
如何正确引用其他活动的视图?
永远不要将您的观点声明为 静态 ,
这是个坏主意
原因是每个视图都包含 context 对象。在这种情况下,两个静态视图将保存活动上下文,因此当Activity超出范围时,它将不会被销毁,并且仍然被静态视图引用。 < / p>
那么如果没有警告信息我怎么能正确地做到?
您可以采取以下两种方式:
1)如果要在同一屏幕上显示多面板UI,请使用片段。
2)否则,如果仍然使用“活动”,则在从当前活动执行某些操作时将状态更改保存在共享首选项中,并且再次显示您的活动后,请阅读状态更改并更改用户界面相应的。
答案 1 :(得分:3)
如何正确引用其他活动的视图?
将无线电组设为静态变量(永远不会将您的视图声明为静态)以使用另一个活动也是错误的想法也可能导致内存泄漏,您可以使用Fragments
当我在2个无线电组上声明静态时,有一个警告说练习会导致内存泄漏
如果内存中有任何数据无法进行垃圾回收,就会发生内存泄漏。话虽如此,静态变量无法进行垃圾回收,因为它们在整个应用程序生命周期中都保留在内存中。 -static变量可以被垃圾收集一次
那么如果没有警告信息我怎么能正确地做到?
Fragments
Fragment
表示活动中的行为或用户界面的一部分。您可以在单个活动中组合多个fragments
以构建多窗格UI,并在多个活动中重用片段。您可以将片段视为活动的模块化部分,它具有自己的生命周期,接收自己的输入事件,并且您可以在活动运行时添加或删除(有点像&#34;子活动&# 34;您可以在不同的活动中重复使用。)
Shared Preferences
保存单选按钮的状态这是how to use shared Preferences to save the state of radio button
的示例答案 2 :(得分:0)
你根本不应该参考它们。当前的Activity不需要引用其他活动中的对象。从MainActivity启动Activity时,您可以使用Intent
将必要的数据传递给它。
在您的MainActivity.java中:
Intent intent = new Intent(this, OtherActivity.class);
String someData = …;
intent.putExtra("SOME_DATA", someData);
startActivity(intent);
在您的其他活动中:
String someData = getIntent().getStringExtra("SOME_DATA");
答案 3 :(得分:0)
不要直接改变来自不同UI控制器(活动或片段)的视图状态。
使用本地存储(SQL或共享首选项)来存储视图的状态。
在UI的onResume
中,控制器从本地存储读取状态值并更新UI组件(在您的情况下为RadioButton)。
最好从android
中的缓存加载UI状态