【问题标题】:How to call recreate from another class in Kotlin? [closed]如何从 Kotlin 的另一个类调用 recreate? [关闭]
【发布时间】:2021-09-09 04:38:02
【问题描述】:

如何从 Kotlin 的另一个类调用 recreate()?我习惯了 Java,并在下面显示的代码中做了一些 UI 更改。

public class MainActivity extends AppCompatActivity {

    private static MainActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        instance = this;
    }

    public static MainActivity getInstance() {
        return instance;
    }
}

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    private void onClick(View view) {
        MainActivity.getInstance().recreate();
    }
}

如果有人知道如何在 Kotlin 中实现这一点,那就太好了,我对此非常坚持。 最好的问候, 马库斯

【问题讨论】:

    标签: android kotlin recreate


    【解决方案1】:

    上面回答的@broot 对 1:1 端口是正确的,但这种做法是完全错误的。您在这里所做的实际上是创建一个对甚至不再向用户显示的活动的强引用。

    但是你应该做的是如下的事情:-

    在第二个活动中

     val intent = Intent(BROADCAST_RECREATE_MAIN)
     LocalBroadcastManager.getInstance(this@ SecondActivity).sendBroadcast(intent)
    

    主活动内部

    private val localBroadcastReceiver by lazy {
      object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
          \\Recreate main here
        }
      }
    }
    

    MainActivity 的 onCreate 内部

    val intentFilter = IntentFilter()
    intentFilter.addAction(BROADCAST_RECREATE_MAIN)
    LocalBroadcastManager.getInstance(context)
            .registerReceiver(localBroadcastReceiver, localBroadcastIntentFilter)
    

    在 onDestroy 里面

    LocalBroadcastManager.getInstance(requireContext())
            .unregisterReceiver(localBroadcastReceiver)
    
       
    

    【讨论】:

      【解决方案2】:

      到 Kotlin 的 1:1 端口类似于:

      class MainActivity {
          protected fun onCreate() {
              instance = this
          }
      
          companion object {
              lateinit var instance : MainActivity
          }
      }
      
      class SecondActivity {
          private fun onClick() {
              MainActivity.instance.recreate()
          }
      }
      

      但这看起来确实是个坏主意。您应该使用一种可用的方式在活动之间进行通信,而不是像这样重新创建它。我想这不是你问的:-)

      【讨论】:

      • 感谢您的回答!你会建议什么作为实现这一目标的正确方法?我需要此活动处于活动状态,同时重新创建所有其他已创建的活动(用于 UI 更改)。以这种方式使用它的主要缺点是什么?
      • 我不会建议具体的解决方案,因为我对 Android 还不够熟悉。将活动存储在任何地方都感觉不对,因为活动是由框架管理的。此外,Android 的组件通常不直接通信——你不会实例化一个活动并显示它,但你会发送一个意图。我想在活动之间打开某种通信通道或事件总线并发送命令来重新创建自己会更干净。但是 ss 我说,我不确定这里最好的是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2016-06-14
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      相关资源
      最近更新 更多