当前位置: 首页 > 知识库问答 >
问题:

只有在使用碎片时,平板电脑上才会出现异常

景岳
2023-03-14

当我在平板电脑上使用我的应用程序时,我得到了NullPointerException,而它在模拟器(平板手机)和手机上运行良好。

问题似乎是在与其他片段通信时。

我的平板电脑是1280x800,7“

我有五个XML文件:

主要活动。xml
activity\u main。xml(土地)
主要活动。xml(sw600dp)

项目信息片段。xml
listview_片段。xml

主要活动。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_片段。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。萨巴斯特。Androidlistfragmenttest,PID:26930 java。lang.NullPointerException:尝试调用接口方法“void com”。萨巴斯特。Android列表碎片测试。ListViewFragment$OnitemClickedListener。com上的空对象引用上的onItemClick(int)。*****。Android列表碎片测试。ListViewFragment。android上的onListItemClick(ListViewFragment.java:63)。应用程序。2美元。android上的onItemClick(ListFragment.java:160)。小装置。AdapterView。android上的performItemClick(AdapterView.java:340)。小装置。AblistView。android上的performItemClick(AblistView.java:1532)
。小装置。AbsListView$PerformClick。在android上运行(AbsListView.java:3700)。小装置。AbsListView 3美元。在android上运行(AbsListView.java:5686)。操作系统。汉德勒。android上的handleCallback(Handler.java:739)。操作系统。汉德勒。android上的dispatchMessage(Handler.java:95)。操作系统。活套。android上的loop(Looper.java:145)。应用程序。活动线程。java上的main(ActivityThread.java:6939)。朗,反思一下。方法在java上调用(本机方法)。朗,反思一下。方法在com上调用(Method.java:372)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(zyteinit.java:1404)。Android内部的操作系统。合子体。main(ZygoteInit.java:1199)

共有2个答案

胡昊
2023-03-14

谢天谢地,我找到了答案,因为我使用的API低于23,在我的平板电脑上是22,没有使用支持库,所以从来没有调用过onAttach(上下文),所以我不得不使用onAttach(活动)

东门翰
2023-03-14

您的回调接口从未初始化,

所以调用方法

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

正在引发空指针异常

在触发回调之前,需要检查空值

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

或者定义一个setter方法,允许您正确初始化接口。

 类似资料:
  • 当调用find any pictures时,它似乎抛出了一个运行时异常,我不知道为什么它会告诉我我没有适当的权限。我已经在android manifest中包含了它提到的权限,但我不知道grantUriPermission()是什么?下面是堆栈跟踪  

  • 我的代码只会在三星Galaxy平板电脑上崩溃(例如SM-P601、Android4.4.2)。 崩溃的代码是这一行: 另一个失败的代码只是在OnClick方法中: null

  • 我创建了一个Android应用程序,它不能在平板电脑上运行。 我已经在文件夹中添加了文件。当我在模拟器上运行时,它正在工作,但在平板电脑中它给出了错误, 日志输出: java.lang.RuntimeException:无法启动活动ComponentInfo{idev.android.soulspotter/idev.aandroid.sourlspotter.Login}:android.con

  • 我的广播接收器由事件BOOT_COMPLETED触发,在除Nomi C10103以外的许多设备上工作正常。该消息出现在设备上的日志中:d/activitymanager:send broadcast:Android.intent.action.boot_completed,跳过package:com.example.MyPackageName 发送消息am广播-来自adb shell的Androi

  • 我开发的一个应用程序没有显示在这台平板电脑上。下面是我的清单文件。任何帮助都将得到高度赞赏。

  • Play developer控制台中显示: 您的APK似乎不是为平板电脑设计的 但是我已经将布局添加到layout-sw600dp、layout-sw600dp-land、layout-sw720dp和layout-sw720dp-land文件夹中。完整清单(原样): 我的APP截图: 虽然这款应用似乎可以在平板电脑上运行(我只在emulator上进行了测试),但要满足播放标准,必须做些什么呢?