Как отключить сенсорный экран для всего экрана (Fragment + BottomNavigation) при получении данных из базы данных? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть навигация по дну с 3 фрагментами (меню).Но если мы нажмем кнопку (включая кнопку навигации внизу), пока приложение все еще извлекает данные, приложение будет аварийно завершено.

Я попытался выполнить поиск по этой проблеме в google и stackoverflow.Но это только делает фрагмент неприкосновенным, а не как с нижней навигацией.

MainActivity.kt

private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_home -> {
            replaceFragment(HomeFragment())
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_account -> {
            replaceFragment(AccountFragment())
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_other -> {
            replaceFragment(OtherFragment())
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    nav_view.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
    replaceFragment(HomeFragment())
    FirebaseMessaging.getInstance().isAutoInitEnabled = true
}

private fun replaceFragment(fragment: Fragment) {
    val fragmentTransaction = supportFragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.fragmentContainer, fragment)
    fragmentTransaction.commit()
}

HomeFragment.kt

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View = inflater.inflate(R.layout.fragment_home, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    lrMath.setOnClickListener {
        val matematikaIntent = Intent(requireActivity(), MathActivity::class.java)
        requireActivity().startActivity(matematikaIntent)
    }
    fetchUser()
}
.
.
.
private fun fetchUser() {
    val uid = FirebaseAuth.getInstance().currentUser?.uid
    val ref = FirebaseDatabase.getInstance().getReference("/users")


    ref.addListenerForSingleValueEvent(object : ValueEventListener {
        @SuppressLint("SetTextI18n")
        override fun onDataChange(p0: DataSnapshot) {
            p0.children.forEach {
                val user = it.getValue(User::class.java)

                if (user != null && uid == user.uid) {
                    textGreetings = "Hi " + user.name + ","

                    Picasso.get().load(user.profileImageUrl).into(profile_button)
                    greetings_textview.text = textGreetings
                    flag = 1
                }
            }
        }

        override fun onCancelled(p0: DatabaseError) {
        }
    }
    )
}

Я хочу сделать всепросмотр / неприкосновенность экрана, пока данные не извлечены.Так что сбоев не будет.

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Вы можете заблокировать событие касания для действия:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

И включить его снова:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Просто создайте интерфейс между фрагментом и действием для вызова методоввключить / отключить его.

0 голосов
/ 18 июня 2019

Вы можете использовать индикатор выполнения (загрузчик) вместо отключения сенсорного события.Отображение индикатора выполнения - лучший подход для извлечения данных.

Вот пример,

CustomDialog.java

public class CustomDialog {

public static Dialog loadDialog = null;

public static void showLoader(Activity context) {

    if (loadDialog != null) {
        if (loadDialog.isShowing())
            loadDialog.dismiss();
    }
    loadDialog = new Dialog(context, R.style.TransparentDialogTheme);
    loadDialog.setContentView(R.layout.loader);
    loadDialog.setCanceledOnTouchOutside(false);
    loadDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK)
                return true;
            return false;
        }
    });
    if (!loadDialog.isShowing()) {
        loadDialog.show();
    }
}

public static void hideLoader() {
    if (loadDialog != null && loadDialog.isShowing())
        loadDialog.dismiss();
}

}

TransparentDialogTheme

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="@dimen/_60sdp"
    android:layout_height="@dimen/_60sdp"
    android:layout_centerInParent="true"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    android:indeterminate="true"
    android:indeterminateDrawable="@drawable/bg_progress" />

bg_progress

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360">
<shape
    android:innerRadiusRatio="3"
    android:shape="ring"
    android:thicknessRatio="12"
    android:useLevel="false">
    <size
        android:width="200dp"
        android:height="200dp" />
    <gradient
        android:angle="0"
        android:centerColor="@color/colorLightRed"
        android:endColor="@color/colorLightRed"
        android:startColor="@color/colorDarkRed"
        android:type="sweep"
        android:useLevel="false" />
</shape>

0 голосов
/ 17 июня 2019

лучший способ сделать это с помощью индикатора выполнения (Загрузка ..) пока приложение не закончит данные ИЛИ Вы должны использовать сервис в фоновом режиме. посмотрите на этот пример для индикатора прогресса здесь надеюсь, что помог вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...