Это - мое решение, когда я столкнулся с ним: ProgressDialog
не Fragment
ребенок, таким образом, мой пользовательский класс "ProgressDialogFragment
" может расшириться DialogFragment
вместо этого для хранения диалогового окна показанным для изменений конфигурации.
import androidx.annotation.NonNull;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
/**
* Usage:
* To display the dialog:
* >>> ProgressDialogFragment.showProgressDialogFragment(
* getSupportFragmentManager(),
* "fragment_tag",
* "my dialog title",
* "my dialog message");
*
* To hide the dialog
* >>> ProgressDialogFragment.hideProgressDialogFragment();
*/
public class ProgressDialogFragment extends DialogFragment {
private static String sTitle, sMessage;
private static ProgressDialogFragment sProgressDialogFragment;
public ProgressDialogFragment() {
}
private ProgressDialogFragment(String title, String message) {
sTitle = title;
sMessage = message;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return ProgressDialog.show(getActivity(), sTitle, sMessage);
}
public static void showProgressDialogFragment(FragmentManager fragmentManager, String fragmentTag, String title, String message) {
if (sProgressDialogFragment == null) {
sProgressDialogFragment = new ProgressDialogFragment(title, message);
sProgressDialogFragment.show(fragmentManager, fragmentTag);
} else { // case of config change (device rotation)
sProgressDialogFragment = (ProgressDialogFragment) fragmentManager.findFragmentByTag(fragmentTag); // sProgressDialogFragment will try to survive its state on configuration as much as it can, but when calling .dismiss() it returns NPE, so we have to reset it on each config change
sTitle = title;
sMessage = message;
}
}
public static void hideProgressDialogFragment() {
if (sProgressDialogFragment != null) {
sProgressDialogFragment.dismiss();
}
}
}
проблема состояла в том, чтобы сохранить диалоговый заголовок & обменивайтесь сообщениями, в то время как экранное вращение, поскольку они сбрасывают к пустой строке по умолчанию, хотя диалоговое окно, все еще показанное
существует 2 подхода для решения этого:
Первый подход: Делают действие, которое использует диалоговое окно для сохранения состояния во время изменения конфигурации в файле манифеста:
android:configChanges="orientation|screenSize|keyboardHidden"
Этот подход не предпочтен Google.
1119-секундный подход: на действии onCreate()
метод, необходимо сохранить Ваш DialogFragment
путем восстановления ProgressDialogFragment
снова с заголовком & обменивайтесь сообщениями следующим образом, если эти savedInstanceState
не является пустым:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal);
if (savedInstanceState != null) {
ProgressDialogFragment saveProgressDialog = (ProgressDialogFragment) getSupportFragmentManager()
.findFragmentByTag("fragment_tag");
if (saveProgressDialog != null) {
showProgressDialogFragment(getSupportFragmentManager(), "fragment_tag", "my dialog title", "my dialog message");
}
}
}
Является ли ваш диапазон входных значений произвольным или известен в пределах определенного диапазона?
в любом случае x m = exp (m log x), поэтому, если вы может создавать функции для вычисления exp (x) и log (x) и иметь умножение, вы, вероятно, все в порядке.
Вам нужно будет выяснить, как вы хотите обрабатывать неположительные значения x.
(подсказка для журнала (x): если это с плавающей точкой IEEE-754 , сместите мантиссу, если необходимо, пока вы не получите диапазон чисел от 2 k до 2 k + 1 для некоторого значения K. Это позволяет вам работать с диапазоном 2: 1, что не слишком трудно аппроксимировать с помощью многочленов. Тогда у вас будет лишь небольшое количество возможностей для обработки экспоненты и числа сдвига.
Соответствующий совет для exp (x): напишите x = k + b, где 0 <= b < 1 и k - целое число. Тогда exp (x) = exp (k) * exp (b); b имеет ограниченный диапазон, а k имеет ограниченное количество дискретных возможностей.)
(подсказка № 2: числа, вероятно, лучше работают для x m = g (mf (x)), где f (x ) = log 2 x и g (x) = 2 x .)
Как сказал Джейсон С., это делается с использованием тождества x m = exp (m log x). Однако на практике вам придется иметь дело с ошибками усечения. Я думаю, что обычно это делается так: