Answers:
您可以使用getActivity()
,返回与关联的活动fragment
。
活动是context
(自Activity
扩展以来Context
)。
getActivity().getApplicationContext()
在创建碎片时将的值存储在实例变量中,然后在需要时在碎片类中使用该上下文。该上下文将在碎片分离中幸存下来。
getActivity
一直可用。它getContext
是在API 23中添加的
为此,您可以覆盖onAttach
fragment方法:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
DatabaseHelper
需要a FragmentActivity
而不是a Activity
怎么办?例如Adapter
...
onAttach(Activity activity)
则应在以下位置发布它onDetach()
onAttach
方法已被弃用,Overrides deprecated method in 'android.support.v4.app.Fragment'
始终使用getActivity()方法获取所附加活动的上下文,但始终记住一件事:片段有些不稳定,getActivity
有时会返回null,因此,请始终在通过获取上下文之前检查片段的iwego()方法getActivity()
。
获取我发现的片段的上下文的最简单,最精确的方法是直接从至少在这里ViewGroup
调用onCreateView
方法时从那里获取它,您肯定不会为null getActivity()
:
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
以前我是onAttach (Activity activity)
用来进去context
的Fragment
问题
该onAttach (Activity activity)
方法已在API级别23中弃用。
解
现在获取上下文, Fragment
我们可以使用onAttach (Context context)
onAttach (Context context)
context
。onCreate(Bundle)
在此之后将被调用。文献资料
/**
* Called when a fragment is first attached to its context.
* {@link #onCreate(Bundle)} will be called after this.
*/
@CallSuper
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity = mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
样本代码
public class FirstFragment extends Fragment {
private Context mContext;
public FirstFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext=context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rooView=inflater.inflate(R.layout.fragment_first, container, false);
Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
// Inflate the layout for this fragment
return rooView;
}
}
我们也可以用getActivity()
得到context
的Fragments
,但getActivity()
可以返回null
,如果您 fragment
当前未连接到父activity
,
在Fragment中获取上下文可以使用getActivity()
:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Activity
使用与片段相关联getActivity()
,可以使用它,但不建议这样做会导致内存泄漏。我认为必须Activity
从该onAttach()
方法获取更好的方法:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
Activity.findViewById
这只是在该活动的注册内容视图(通过中设置setContentView
)中搜索视图的一种便捷方法。在正确的示例中,您正在调用View.findViewById
,而不是Activity.findViewById
,并且您正在正确的根视图上调用该方法。完全不同的问题,很明显,您将无法在没有该视图的视图层次结构中找到您的视图。
对于Kotlin,您可以context
直接在片段中使用。但是在某些情况下,您会发现类似
类型不匹配:推断的类型是上下文?但是期望上下文
为此,您可以这样做
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
使用Kotlin上的API 29+,我不得不
activity?.applicationContext!!
一个例子是
ContextCompat.getColor(activity?.applicationContext!!, R.color.colorAccent),
简单的方法是使用getActivity()
。但是我认为使用该getActivity()
方法在此处获取上下文的主要困惑是空指针异常。
为此,首先检查isAdded()
将确定是否添加了该方法的方法,然后我们可以使用getActivity()
获取活动的上下文。
您可以使用getActivity()方法获取上下文,也可以使用getContext()方法。
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
希望对您有所帮助!
getContext()方法有助于在片段活动中使用类的上下文。
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;
}
}
我需要使用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));
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)
因为如果片段未附加到活动中,则该字段可以为null。有时在片段中进行长时间操作(例如从rest api获取数据)需要一些时间。以及用户是否导航到另一个片段。然后getActivity将为null。如果不处理,您将获得NPE。
FragmentHostCallback
类的实例。
Kotlin样本的内部片段将帮助某人
textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
如果您使用数据绑定;
bindingView.textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
凡bindingView在初始化onCreateView这样
private lateinit var bindingView: FragmentBookingHistoryDetailBinding
bindingView = DataBindingUtil.inflate(inflater, R.layout.your_layout_xml, container, false)
requireContext()方法是最简单的选项
requireContext()
例
MyDatabase(requireContext())