2016-02-19 86 views
1

用戶發生崩潰。我知道爲什麼,但我不知道如何解決它。我是android dev中的新手。Android:活動中的片段。從片段獲取視圖時發生NullPointerException

情況: 安卓:內部活動片段。片段有一個EditText。活動有一個按鈕。用戶點擊按鈕。 Inside 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()可以爲空(已經GOOGLE了它)。
  • Init「查看」裏面的onCreateView沒用。崩潰仍然發生。
  • Init「查看」裏面的onViewCreated無用。崩潰仍然發生。

在仿真器或智能手機,我不能重現此崩潰。我的應用程序有穩定的工作。但有些用戶有崩潰,Fabric(crashlytics)正在發送關於它的消息。

的人!幫幫我!如何正確地從片段獲取一些視圖?我無法從Fragment的生命週期中找到答案。請向我解釋什麼是錯的。

+0

你有沒有考慮過的[片段,活動週期的關係(http://3.bp.blogspot.com/-YJSE-iQngrw/U3bLHPnB1YI/AAAAAAAABWs/CD03Kp6O-zM/s1600/fragmentlifecycle.png)?您將需要檢查你是不是嘗試之前'在onStart訪問'EditText'你'Fragment'內()'叫你'Activity',以確保它已被初始化。 – PPartisan

+0

什麼時候你會調用run()方法。因爲如果您在activity的onCreate()中調用run(),那麼它將返回null,因爲片段不會被創建。 – Jois

+0

請指定你從哪裏調用run()? –

回答

0

使用butterknife這樣的:

class ExampleActivity extends Activity { 
    @Bind(R.id.user) EditText username; 
    @Bind(R.id.pass) EditText password; 

    @BindString(R.string.login_error) 
    String loginErrorMessage; 

    @OnClick(R.id.submit) void submit() { 
// TODO call server... 
    } 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_activity); 
    ButterKnife.bind(this); 
    // TODO Use fields... 
    } 
} 
+0

btw,Init「View」在onViewCreated裏面 – TomDuan

0

從你的代碼,似乎你只創建了片段的實例,並試圖訪問的觀點。但是,讓你不得不片段添加到片段的觀點你活動。

這樣做是你的活動

FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
MyFrag myFrag= MyFrag(); 
ft.replace("YOUR_FRAGMENT_CONTAINER's id", myFrag); 
ft.commit(); 
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(); 
0
  • 片段添加到活動中Activity.onCreate()方法。

  • 期間,在片段Fragment.onAttach (Context)獲取參考活動。

  • 在像enableButton()活動創建一個方法,該方法將使按鈕等button.setEnabled (true)

  • 在初始化EditText後,從片段onCreateView調用此方法。

這種方式可以確保單擊該按鈕之前EditText被初始化。

還記得,使活動參考空在Fragment.onDetach(),以防止任何泄漏。

0

如果使用在片段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; 
    } 
}