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)
我希望它有帮助!
| 归档时间: |
|
| 查看次数: |
455727 次 |
| 最近记录: |