Вы пытались решить проблему с клейкой лентой?
Попробуйте определить, когда возникают ошибки, и исправьте их короткими операторами if, это не очень, но для некоторых проблем это единственное решение, и это один из них .
if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
else { return n * 0.1 + 0.000000000000001 ;}
У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **
Вы можете использовать getActivity()
, который возвращает активность, связанную с фрагментом. Активность - это контекст (поскольку Activity расширяет контекст) .
Поскольку уровень API 23 существует getContext()
, но если вы хотите поддерживать более старые версии, вы можете использовать getActivity().getApplicationContext()
, пока я по-прежнему рекомендую использовать версию поддержки Fragment
, которая является android.support.v4.app.Fragment
.
Также вы можете использовать:
inflater.getContext();
, но я бы предпочел использовать
getActivity()
или
getContext
Самый простой и самый точный способ получить контекст фрагмента, который я нашел, - это получить его непосредственно из ViewGroup
, когда вы вызываете метод onCreateView
, по крайней мере, здесь вы уверены, что не получите null для getActivity()
:
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
Метод getContext () помогает использовать Контекст класса в активности фрагмента.
, чтобы получить контекст внутри фрагмента, будет возможно с помощью getActivity()
:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Activity
, связанный с фрагмент, использующий getActivity()
, вы можете использовать его, но не рекомендуется, чтобы он вызывал утечки памяти. Я думаю, что лучший aproach должен получать Activity
из метода onAttach()
:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
getActivity()
или getContext
в фрагменте. Документация
/**
* Return the {@link FragmentActivity} this fragment is currently associated with.
* May return {@code null} if the fragment is associated with a {@link Context}
* instead.
*
* @see #requireActivity()
*/
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
и
/**
* Return the {@link Context} this fragment is currently associated with.
*
* @see #requireContext()
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
Всегда проверяйте if(getActivity!=null)
, поскольку он может быть нулевым, если фрагмент не привязан к активности. Иногда длительная работа в фрагменте (например, выборка данных из rest api) занимает некоторое время. и если пользователь перейдет к другому фрагменту. Тогда getActivity будет null. И вы получите NPE, если вы не справитесь с этим.
Для Kotlin вы можете использовать context
непосредственно в фрагментах. Но в некоторых случаях вы найдете ошибку, например
Тип несоответствия: inferred type is Context? но ожидался контекст
blockquote>, для которого вы можете это сделать
val ctx = context ?: return textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
Использовать фрагменты из библиотеки поддержки -
android.support.v4.app.Fragment
, а затем переопределить
void onAttach (Context context) {
this.context = context;
}
Таким образом, вы можете быть уверены, что контекст всегда будет ненулевым значением.
Вы также можете получить контекст из параметра inflater
при переопределении onCreateView
.
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
Чтобы сделать как ответ выше, вы можете переопределить метод фрагмента onAttach
:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
public class MenuFragment extends Fragment implements View.OnClickListener {
private Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
View view=binding.getRoot();
mContext=view.getContext();
return view;
}
}
Я думаю, вы можете использовать
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
Простым способом является использование getActivity()
. Но я думаю, что основная путаница использования метода getActivity()
для получения контекста здесь - исключение нулевого указателя.
Для этого сначала проверьте метод isAdded()
, который определит, добавлен он или нет, и затем мы можем использовать getActivity()
, чтобы получить контекст Activity.
getActivity()
является дочерним элементом контекста, поэтому он должен работать для вас
У вас есть разные опции:
getActivity()
, так как это Context
. getContext()
. Если вам не нужно поддерживать старые версии, перейдите к getContext()
.
В идеале вам не нужно использовать глобальные переменные. Фрагмент имеет разные уведомления, один из которых - onActivityCreated. Вы можете получить экземпляр действия в этом жизненном цикле фрагмента.
Затем: вы можете разыменовать фрагмент, чтобы получить активность, контекст или контекст приложения по вашему желанию:
this.getActivity()
даст вам дескриптор активности this.getContext()
даст вам дескриптор контекста this.getActivity().getApplicationContext()
, который даст вам дескриптор контекста приложения. Вы должны предпочтительно использовать контекст приложения при передаче его на db.
Вы можете вызвать getActivity()
или
public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
Мне нужен контекст для использования фрагмента arrayAdapter IN, когда я использовал ошибку getActivity, но когда я заменяю его getContext, он работает для меня
listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));