Beobachten der Netzwerkänderung innerhalb des Fragments mithilfe von LiveData
Nov 24 2020
Ich möchte überwachen, ob ich mit einer bestimmten SSID verbunden bin. In meiner Hauptaktivität initialisiere ich den Netzwerkwechsel und möchte das Ergebnis im Fragment beobachten, aber dies funktioniert nicht. Bei einem Netzwerkwechsel kann ich das Ergebnis nicht im Fragment erhalten.
Fragment:
class ConnectFragment : Fragment() {
companion object {
fun newInstance() = ConnectFragment()
}
private lateinit var viewModel: SharedViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.connect_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
viewModel.connected.observe(viewLifecycleOwner, {
Log.d(TAG, "Connected: $it")
})
}
}
SharedViewModel:
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class SharedViewModel : ViewModel() {
var connected= MutableLiveData(false)
}
Hauptaktivität:
class MainActivity : AppCompatActivity() {
lateinit var viewModel:SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ViewModelProvider(this).get(SharedViewModel::class.java).also { viewModel = it }
}
override fun onSupportNavigateUp() =
findNavController(this, R.id.navHostFragment).navigateUp()
private val networkCallback: ConnectivityManager.NetworkCallback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d(TAG, "Network Available")
super.onAvailable(network)
viewModel.connected.postValue(isConnectedToSSID())
}
}
private fun startNetworkCallback() {
val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerDefaultNetworkCallback(networkCallback)
}
private fun stopNetworkCallback() {
val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun isConnectedToSSID(): Boolean {
val wifiManager = getSystemService(WIFI_SERVICE) as WifiManager
val info = wifiManager.connectionInfo
val ssid = info.ssid.replace("\"", "")
return ssid.startsWith(WIFI_NETWORK) ?: false
}
override fun onResume() {
super.onResume()
startNetworkCallback()
}
override fun onPause() {
super.onPause()
try {
stopNetworkCallback()
} catch (e: Exception) {
}
}
}
Antworten
Dim Nov 25 2020 at 23:11
Das Problem gefunden:
Benötigt werden:
viewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
Anstelle von:
viewModel = ViewModelProvider(this).get(SharedViewModel::class.java)