Я получаю NullPointerException
при использовании своего приложения на планшетах, пока он отлично работает на Emulater (планшет + телефон) и телефоны.NullPointerException на планшетах только при использовании фрагментов
Проблема, кажется, при общении с другим фрагментом.
Мой планшет 1280x800, 7"
У меня есть пять XML файлы:
activity_main.xml
activity_main.xml(land)
activity_main.xml(sw600dp)
iteminfo_fragment.xml
listview_fragment.xml
Activity_Main.java
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity implements ListViewFragment.OnitemClickedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(findViewById(R.id.layout_container) != null){
if (savedInstanceState != null){
return;
}
ListViewFragment listViewFragment = new ListViewFragment();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.layout_container,listViewFragment);
fragmentTransaction.commit();
}
}
@Override
public void onItemClick(int position) {
ItemInfo_Fragment itemInfo_fragment = (ItemInfo_Fragment) getFragmentManager().
findFragmentById(R.id.ListView_ItemFragmentID);
if(itemInfo_fragment != null) {
itemInfo_fragment.updateInfo(position);
} else {
ItemInfo_Fragment itemInfo_fragment1 = new ItemInfo_Fragment();
Bundle args = new Bundle();
args.putInt("position", position);
itemInfo_fragment1.setArguments(args);
FragmentTransaction fragmentTransaction = getFragmentManager()
.beginTransaction();
fragmentTransaction.replace(R.id.layout_container, itemInfo_fragment1);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
ListViewFragment.java
import android.app.Fragment;
import android.app.ListFragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
/**
* Created by Sarbast on 30/06/2016.
*/
public class ListViewFragment extends ListFragment {
OnitemClickedListener mCallBack;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.listview_fragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] data = getResources().getStringArray(R.array.heros);
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data));
}
@Override
public void onStart() {
super.onStart();
//Highlight the item when using two-pane layout
Fragment fragmentManager = getFragmentManager()
.findFragmentById(R.id.ListView_ItemFragmentID);
ListView v = getListView();
if (fragmentManager != null && v != null){
v.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
mCallBack = (OnitemClickedListener) context;
}catch (ClassCastException e){
throw new ClassCastException(e.toString() + "Must implement OnItemClickedInstance");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
mCallBack.onItemClick(position);
}
public interface OnitemClickedListener {
public void onItemClick(int position);
}
}
itemInfo_Fragment.java
public class ItemInfo_Fragment extends Fragment {
TextView mTextView;
String[] mStrings;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.iteminfo_fragment, container, false);
mTextView = (TextView) v.findViewById(R.id.showInfo_ID);
mStrings = getResources().getStringArray(R.array.heros_info);
Bundle args = getArguments();
if (args != null) {
int index = args.getInt("position");
mTextView.setText(mStrings[index]);
}
return v;
}
public void updateInfo(int position){
mTextView.setText(mStrings[position]);
}
}
Ошибка:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.sarbast.android.listfragmenttest, PID: 26930 java.lang.NullPointerException: Attempt to invoke interface method 'void com.sarbast.android.listfragmenttest.ListViewFragment$OnitemClickedListener.onItemClick(int)' on a null object reference at com.******.android.listfragmenttest.ListViewFragment.onListItemClick(ListViewFragment.java:63) at android.app.ListFragment$2.onItemClick(ListFragment.java:160) at android.widget.AdapterView.performItemClick(AdapterView.java:340) at android.widget.AbsListView.performItemClick(AbsListView.java:1532)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3700) at android.widget.AbsListView$3.run(AbsListView.java:5686) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:6939) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Спасибо за ответ, теперь я знаю точную проблему, но до сих пор не знаю, где и как я должен инициализировать 'mCallBack', потому что developers.android не упоминает инициализацию, или' onAttach' - это то, где мы его инициализируем. и почему он работает на телефонах без его инициализации? – SarKurd