簡體   English   中英

僅當使用片段時,Tablet上才會出現NullPointerException

[英]NullPointerException on Tablets only when using Fragments

我在平板電腦上使用我的應用程序時收到NullPointerException ,但在Emulater(平板電腦+手機)和手機上可以正常工作。

問題似乎出在與其他Fragment通信時。

我的平板電腦是1280x800,7英寸

我有五個XML文件:

activity_main.xml
activity_main.xml(土地)
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:致命例外:主進程:com.sarbast.android.listfragmenttest,PID:26930 java.lang.NullPointerException:嘗試調用接口方法'void com.sarbast.android.listfragmenttest.ListViewFragment $ OnitemClickedListener.onItemClick(int) '在com。******。android.listfragmenttest.ListViewFragment.onListItemClick(ListViewFragment.java:63)在android.app.ListFragment $ 2.onItemClick(ListFragment.java:160)上的空對象引用上.AdapterView.performItemClick(AdapterView.java:340)位於android.widget.AbsListView.performItemClick(AbsListView.java:1532)
在android.widget.AbsListView $ PerformClick.run(AbsListView.java:3700)在android.widget.AbsListView $ 3.run(AbsListView.java:5686)在android.os.Handler.handleCallback(Handler.java:739)在android .os.Handler.dispatchMessage(Handler.java:95)位於android.os.Looper.loop(Looper.java:145)位於android.app.ActivityThread.main(ActivityThread.java:6939)在java.lang.reflect。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)處java.lang.reflect.Method.invoke(Method.java:372)處的Method.invoke(Method.java:372)。 internal.os.ZygoteInit.main(ZygoteInit.java:1199)

您的回調接口永遠不會初始化,

所以調用方法

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
      super.onListItemClick(l, v, position, id);
      mCallBack.onItemClick(position);
}

拋出一個空指針異常

您需要在觸發回調之前檢查null

if(mCallBack!=null){
     mCallBack.onItemClick(position);
}

或定義一個setter方法,使您可以正確初始化接口。

值得慶幸的是,我找到了答案,因為我使用的API低於23(在我的平板電腦上為22),並且不使用支持庫,所以從未調用過onAttach(Context context)所以我不得不使用onAttach(Activity activity)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM