自定义视图的onTouchListener不断破坏我的应用程序 我目前正在为Android制作一个音板应用程序,带有自定义的neomorphic按钮。我的应用程序目标是,当我使用onTouchListener单击按钮时,该按钮可以改变样式(看起来像被按下了一样)。但是,每当我尝试添加onTouchListener(在MainAcitvity.java上的initButton()函数中)时,我的应用程序就会崩溃。我附上了我的代码以及我在下面使用的Neomrophic库的链接:

自定义视图的onTouchListener不断破坏我的应用程序 我目前正在为Android制作一个音板应用程序,带有自定义的neomorphic按钮。我的应用程序目标是,当我使用onTouchListener单击按钮时,该按钮可以改变样式(看起来像被按下了一样)。但是,每当我尝试添加onTouchListener(在MainAcitvity.java上的initButton()函数中)时,我的应用程序就会崩溃。我附上了我的代码以及我在下面使用的Neomrophic库的链接:,java,android,android-studio,android-layout,Java,Android,Android Studio,Android Layout,新形态视图库: MainActivity.java 公共类MainActivity扩展了AppCompatActivity{ private SectionsPageAdapter mSectionsPageAdapter; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s

新形态视图库:


MainActivity.java
公共类MainActivity扩展了AppCompatActivity{

    private SectionsPageAdapter mSectionsPageAdapter;
    private ViewPager mViewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        TextView textView = findViewById(R.id.titleText);
        String text = "R6 Soundboard";
        SpannableString ss = new SpannableString(text);
        ForegroundColorSpan fcsYellow = new ForegroundColorSpan(Color.rgb(255,236,141));
        ss.setSpan(fcsYellow, 1,2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(ss);


        mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        setUpViewPager(mViewPager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setTabTextColors(Color.WHITE, Color.WHITE);
        tabLayout.setupWithViewPager(mViewPager);
        tabLayout.getTabAt(0).setText("Defenders");
        tabLayout.getTabAt(1).setText("Attackers");

        initButton();
    }

    private void setUpViewPager(ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
        adapter.addFragment(new defendersTab(), "Defenders");
        adapter.addFragment(new attackersTab(), "Attackers");

        viewPager.setAdapter(adapter);

    }

    @SuppressLint("ClickableViewAccessibility")
    private void initButton(){
        final NeumorphCardView DefR1C1 = (NeumorphCardView) findViewById(R.id.buttonDR1C1);

        DefR1C1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP) {
                    DefR1C1.setShapeType(ShapeType.PRESSED);
                } else if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    DefR1C1.setShapeType(ShapeType.FLAT);
                }
                return false;
            }

        });




        /*
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.lionroar);
        DefR1C1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                if(mp.isPlaying()) {
                    //STOP PLAYING
                    mp.seekTo(0);
                }
                mp.start();
                return false;
            }

        });

         */
    }

}
activity_main.xml



感谢您提供的任何见解!

您的错误是您正在MainActivity.java中使用activity\u main.xml。但是,您提供的xml文件名为fragment\u\u tab。您在代码中根本没有引用它

因此,简单的解决方法应该是改变这一点:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
为此:

super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_defenders_tab);

您的NeumorpCardView未正确初始化,因此它引发NullPointerException。我猜您没有在activity_main.xml中正确设置表格布局。具体来说,您的android:id=“@+id/tabs”是什么参考?我认为您没有成功地将碎片\u defenders\u选项卡连接到活动\u main。

请添加您的崩溃日志?@Sarah我在上面附加了它!谢谢您您的自定义按钮未正确初始化尝试清理和重建项目。@AfshinSamiei您能详细说明一下吗?这并不能解决我的问题。碎片\u deFinders_tab.xml是我的mainactivity.xml表LayoutHMMM上的一个xml。该程序运行良好,之前显示了带有滑动选项卡布局的应用程序。但是,当我试图在mainactivity.java文件中声明NeumorphCardView时,它崩溃了。“@+id/tabs”是我提供给tablayout的id。在我尝试在java中声明NeumorphCardView之前,我附加了一张我的应用程序工作的图片。请将您的代码附加到您使用id=“@+id/tabs”定义tablayout的位置,好吗?当然!我在上面附加了它。我不确定我的TableAyout是否有问题,因为我的TableAyout仍然能够在TableAyout上显示我的按钮,但当我试图使它们可点击时,应用程序崩溃了。
public class SectionsPageAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public SectionsPageAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return super.getPageTitle(position);
    }
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }
    @Override
    public int getCount() {
        return mFragmentList.size();
    }
}
2020-12-14 10:54:31.781 8217-8217/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jkcarraher.rainbowsixsoundboard, PID: 8217
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jkcarraher.rainbowsixsoundboard/com.jkcarraher.rainbowsixsoundboard.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void soup.neumorphism.NeumorphCardView.setOnTouchListener(android.view.View$OnTouchListener)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void soup.neumorphism.NeumorphCardView.setOnTouchListener(android.view.View$OnTouchListener)' on a null object reference
    at com.jkcarraher.rainbowsixsoundboard.MainActivity.initButton(MainActivity.java:70)
    at com.jkcarraher.rainbowsixsoundboard.MainActivity.onCreate(MainActivity.java:54)
    at android.app.Activity.performCreate(Activity.java:7995)
    at android.app.Activity.performCreate(Activity.java:7979)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_defenders_tab);