用户崩溃了。我知道为什么,但我不知道如何解决它。我是android dev的新手。
情况: Android:片段里面的Activity。 Fragment有一个EditText。活动有一个按钮。用户点击按钮。在Button.OnClick()里面我想得到文本Fragment.EditText.getText(); 一些用户在这里发生了崩溃EditText.getText()。即EditText为空。
我该怎么做:
In Activity:
public class MyAcrivity extends AppCompatActivity implements OnFragmentInteractionListener {
final MyFrag myFrag= MyFrag.newInstance();
public void run(final View view) {
//some users have crash here because getEt() return null
final String str = myFrag.getEt().getText().toString();
}
}
在片段中:
public class MyFrag extends Fragment {
private EditText et;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_myfrag, container, false);
et = (EditText) view.findViewById(R.id.et);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
et = (EditText) view.findViewById(R.id.et);
}
public EditText getEt() {
// return (EditText) getView().findViewById(R.id.et); here getView() could be nul too
return et;
}
}
我无法在模拟器或智能手机中重现此崩溃。我有稳定的应用程序工作。但是有些用户遇到了崩溃,而Fabric(crashlytics)正在发送有关它的消息。
人们!救命!如何从Fragment中正确获取一些View?我无法从Fragment的生命周期中找到答案。请向我解释有什么问题。
答案 0 :(得分:0)
像这样使用butterknife:
function resizeImage() {
var size = 800;
if(imgTemp.width > size && imgTemp.width >= imgTemp.height) {
imgTemp.height = (imgTemp.height / imgTemp.width) * size;
imgTemp.width = size;
} else if (imgTemp.height > size && imgTemp.height > imgTemp.width) {
imgTemp.width = (imgTemp.width / imgTemp.height) * size;
imgTemp.height = size;
}
}
答案 1 :(得分:0)
从您的代码中,您似乎只创建了片段实例并尝试访问该视图。但要获取片段视图,您必须将片段添加到您的活动中。
在您的活动中执行此操作
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
MyFrag myFrag= MyFrag();
ft.replace("YOUR_FRAGMENT_CONTAINER's id", myFrag);
ft.commit();
答案 2 :(得分:0)
只是一个hunge,尝试在活动生命周期中进行newInstance()
调用。否则,可能没有可信的上下文来附加片段。尝试在onCreate()
。
可能不相关的内容,但是您是否正确地将该片段附加到活动中?您可能正在做的事情,因为某些用户正在正确访问它。无论如何,这是fragment documentation,以及附加它的代码块。
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment myFrag = MyFrag.newInstance();
fragmentTransaction.add(R.id.fragment_container, myFrag);
fragmentTransaction.commit();
答案 3 :(得分:0)
使用Activity.onCreate()
方法将片段添加到活动中。
在片段Fragment.onAttach (Context)
中获取对活动的引用。
在Activity中创建一个方法,例如enableButton(),它将启用button.setEnabled (true)
之类的按钮。
初始化onCreateView
后,从片段EditText
调用此方法。
这样,您可以确保在单击按钮之前初始化EditText
。
还要记住在Fragment.onDetach
()中将Activity引用设为null以防止任何泄漏。
答案 4 :(得分:0)
如果您在Fragment中使用 getActivity.findViewById 。
public class MyFrag extends Fragment {
private EditText et;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_myfrag, container, false);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
et = (EditText) getActivity.findViewById(R.id.et);
}
public EditText getEt() {
// return (EditText) getView().findViewById(R.id.et); here getView() could be nul too
return et;
}
}