tyc*_*czj 645 java android android-context android-fragments
如何在片段中获取上下文?
我需要用我的数据库其构造函数采用的背景下,但getApplicationContext()
并FragmentClass.this
没有工作,所以我能做些什么?
数据库构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
Run Code Online (Sandbox Code Playgroud)
小智 1270
您可以使用getActivity()
,它返回与a关联的活动fragment
.
活动是context
(自Activity
扩展以来Context
).
小智 128
要做上面的答案,你可以覆盖onAttach
片段的方法:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*rty 25
正确的方法是使用
requireContext()
Run Code Online (Sandbox Code Playgroud)
和例子
ContextCompat.getColor(requireContext(), R.color.colorAccent),
Run Code Online (Sandbox Code Playgroud)
Ank*_*ary 24
始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:碎片稍微不稳定并且getActivity
有时会返回null,因此,在获取上下文之前,请始终检查片段的isAdded()方法getActivity()
.
小智 19
获取我发现的片段的上下文的最简单,最精确的方法是直接从ViewGroup
你调用onCreateView
方法的时候得到它至少在这里你肯定不会得到null getActivity()
:
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
Run Code Online (Sandbox Code Playgroud)
小智 10
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
requireContext() 方法是最简单的选择
requireContext()
Run Code Online (Sandbox Code Playgroud)
例子
MyDatabase(requireContext())
Run Code Online (Sandbox Code Playgroud)
以前我是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);
}
}
Run Code Online (Sandbox Code Playgroud)
样本代码
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我们也可以用getActivity()
得到context
的Fragments
,但getActivity()
可以返回null
,如果您 fragment
当前未连接到父activity
,
另一种替代方法是:
您可以使用以下方式获取上下文:
getActivity().getApplicationContext();
Run Code Online (Sandbox Code Playgroud)
使用以下方法获取Fragment中的上下文getActivity()
:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Run Code Online (Sandbox Code Playgroud)
Activity
使用与片段相关联getActivity()
,您可以使用它,但不建议它会导致内存泄漏.我认为更好Activity
的onAttach()
方法必须是从方法中得到:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
Run Code Online (Sandbox Code Playgroud)
inflater
覆盖时,您还可以从参数获取上下文onCreateView
。
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用 getActivity() 方法来获取上下文,也可以使用 getContext() 方法。
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
Run Code Online (Sandbox Code Playgroud)
我希望它有帮助!