Reputation: 64
I have layout for no internet connection in my app as ViewStub
it should inflated and showing only when internet is disconnected "I have netwrok listener and var isNetworkAvailable
as MutableStateFlow
that lisent to the network state, the problem is when internet is back I trying to hide it but it won't hide and still showing
this my no_internet_connection_layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/no_wifi_image"
android:layout_width="match_parent"
android:layout_height="@dimen/_250sdp"
android:contentDescription="@string/no_wifi_image"
android:src="@drawable/no_internet_connection_icon"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/no_wifi_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="8dp"
android:text="@string/no_internet_connection_message"
android:textSize="@dimen/_20ssp" />
</androidx.constraintlayout.widget.ConstraintLayout>
and I used it inside fragment like that
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/backgroundColor"
android:orientation="vertical"
tools:context=".ui.MainFragment">
<com.facebook.shimmer.ShimmerFrameLayout
android:id="@+id/shimmerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:shimmer_auto_start="false"
app:shimmer_repeat_mode="restart"
app:shimmer_shape="radial">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/placeholder_row" />
<include layout="@layout/placeholder_row" />
<include layout="@layout/placeholder_row" />
<include layout="@layout/placeholder_row" />
<include layout="@layout/placeholder_row" />
<include layout="@layout/placeholder_row" />
</LinearLayout>
</com.facebook.shimmer.ShimmerFrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
android:paddingBottom="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:visibility="invisible"
app:backgroundTint="@color/buttonColor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible">
</ProgressBar>
<ViewStub
android:id="@+id/no_internet_connection_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/no_internet_connection_layout"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:visibility="gone">
</ViewStub>
</androidx.constraintlayout.widget.ConstraintLayout>
the code in fragment
lifecycleScope.launchWhenStarted {
networkListener.checkNetworkAvailability(requireContext()).collect { stats ->
Log.d(TAG, "networkListener: $stats")
postViewModel.networkStats = stats
networkStats = stats
postViewModel.showNetworkStats()
if (stats) {
mainViewModel.getData()
} else {
noInternetConnectionLayout()
Log.e(TAG, "onViewCreated: no internet")
}
}
}
and this method that I called when internet is disconnected to inflate viewStub
private fun noInternetConnectionLayout() {
hideShimmerEffect()
binding. apply {
progressBar.visibility = View.GONE
noInternetConnectionLayout.inflate().also {
if(networkStats){
it.visibility = View.GONE
recyclerView.visibility = View.VISIBLE
progressBar.visibility = View.VISIBLE
}
}
}
}
my network listener
class NetworkListener : ConnectivityManager.NetworkCallback() {
private var isNetworkAvailable = MutableStateFlow(false)
fun checkNetworkAvailability(context: Context): MutableStateFlow<Boolean> {
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
var isConnected = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(this)
connectivityManager.allNetworks.forEach { network ->
val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
networkCapabilities?.let {
if (it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
isConnected = true
return@forEach
}
}
}
isNetworkAvailable.value = isConnected
} else {
val networkChangeFilter = NetworkRequest.Builder().build()
connectivityManager.registerNetworkCallback(networkChangeFilter, this)
connectivityManager.allNetworks.forEach { network ->
val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
networkCapabilities?.let {
if (it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
isConnected = true
return@forEach
}
}
}
isNetworkAvailable.value = isConnected
}
return isNetworkAvailable
}
override fun onAvailable(network: Network) {
isNetworkAvailable.value = true
}
override fun onLost(network: Network) {
isNetworkAvailable.value = false
}
}
Upvotes: 2
Views: 142
Reputation: 422
((ViewGroup) content.getParent()).removeView(noInternetConnectionLayoutt)
or
noInternetConnectionLayout.visibility=view.GONE
Upvotes: 0