Krista
Krista

Reputation: 64

Cannot hide ViewStub layout

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

Answers (1)

user2782067
user2782067

Reputation: 422

((ViewGroup) content.getParent()).removeView(noInternetConnectionLayoutt)

or

noInternetConnectionLayout.visibility=view.GONE

Upvotes: 0

Related Questions