Android:片段里面的Activity。从片段

时间:2016-02-19 08:39:20

标签: android nullpointerexception android-fragmentactivity

用户崩溃了。我知道为什么,但我不知道如何解决它。我是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;
    }


}
  • 我知道getView()可能为null(已经用Google搜索)。
  • Init" View"在onCreateView里面没用。崩溃仍在发生。
  • Init" View"在onViewCreated内部无用。崩溃仍在发生。

我无法在模拟器或智能手机中重现此崩溃。我有稳定的应用程序工作。但是有些用户遇到了崩溃,而Fabric(crashlytics)正在发送有关它的消息。

人们!救命!如何从Fragment中正确获取一些View?我无法从Fragment的生命周期中找到答案。请向我解释有什么问题。

5 个答案:

答案 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;
    }
}