如何正确引用另一个活动的视图?

时间:2018-03-21 04:36:01

标签: android

我在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。那么如果没有警告信息我怎么能正确地做到?

4 个答案:

答案 0 :(得分:4)

  

如何正确引用其他活动的视图?

永远不要将您的观点声明为 静态

这是个坏主意

原因是每个视图都包含 context 对象。在这种情况下,两个静态视图将保存活动上下文,因此当Activity超出范围时,它将不会被销毁,并且仍然被静态视图引用。 < / p>

  

那么如果没有警告信息我怎么能正确地做到?

您可以采取以下两种方式:

1)如果要在同一屏幕上显示多面板UI,请使用片段

2)否则,如果仍然使用“活动”,则在从当前活动执行某些操作时将状态更改保存在共享首选项中,并且再次显示您的活动后,请阅读状态更改并更改用户界面相应的。

答案 1 :(得分:3)

  

如何正确引用其他活动的视图?

将无线电组设为静态变量(永远不会将您的视图声明为静态)以使用另一个活动也是错误的想法也可能导致内存泄漏,您可以使用Fragments

  

当我在2个无线电组上声明静态时,有一个警告说练习会导致内存泄漏

如果内存中有任何数据无法进行垃圾回收,就会发生内存泄漏。话虽如此,静态变量无法进行垃圾回收,因为它们在整个应用程序生命周期中都保留在内存中。 -static变量可以被垃圾收集一次

  

那么如果没有警告信息我怎么能正确地做到?

  1. 您 使用Fragments
  2. Fragment表示活动中的行为或用户界面的一部分。您可以在单个活动中组合多个fragments以构建多窗格UI,并在多个活动中重用片段。您可以将片段视为活动的模块化部分,它具有自己的生命周期,接收自己的输入事件,并且您可以在活动运行时添加或删除(有点像&#34;子活动&# 34;您可以在不同的活动中重复使用。)

    1. 您还可以使用Shared Preferences保存单选按钮的状态
    2. 这是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状态