【问题标题】:Opening activity from fragment force close error从片段强制关闭错误打开活动
【发布时间】:2016-01-26 22:02:10
【问题描述】:

所以今天我创建了标签视图栏和片段,并在其中一个片段中添加了一些图像按钮。 当我在按钮代码上添加 android:onClick="name" 并在 .java 文件中写入 Intent 时,单击该按钮时会出现强制关闭错误。

这是我的代码:

片段.xml

<ImageButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btnProgramiPL5x5"
            android:minHeight="80dp"
            android:background="@mipmap/btn_programi_pl_5x5"
            android:onClick="ProgramiPowerlifting5x5"/>

片段.java

   package hr.app.liftme.liftmehr;


import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;


/**
 * A simple {@link Fragment} subclass.
 */
public class FragmentPowerlifting extends Fragment {



    public FragmentPowerlifting() {
        // Required empty public constructor
    }




    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_powerlifting, container, false);


    }

ProgramiPowerlifting5x5.java

    package hr.app.liftme.liftmehr;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class ProgramiPowerlifting5x5 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_programi_powerlifting5x5);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent = getIntent();
    }

}

我得到的错误是:

01-26 23:00:44.766 14491-14491/hr.app.liftme.liftmehr E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: hr.app.liftme.liftmehr, PID: 14491
                                                                        java.lang.IllegalStateException: Could not find method ProgramiPowerlifting5x5(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageButton with id 'btnProgramiPL5x5'
                                                                            at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:307)
                                                                            at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:266)
                                                                            at android.view.View.performClick(View.java:4856)
                                                                            at android.view.View$PerformClick.run(View.java:19956)
                                                                            at android.os.Handler.handleCallback(Handler.java:739)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                            at android.os.Looper.loop(Looper.java:211)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5389)
                                                                            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:1020)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

我不知道是什么问题,当我链接两个活动时,我使用了this, name.class,但在这种情况下不起作用,所以我使用了getActivity,但它仍然不起作用。

非常感谢您的帮助!

谢谢!

【问题讨论】:

  • 你能展示一下 ProgramiPowerlifting5x5 的所有构造函数吗?
  • Android Studio 是一个 IDE。谁在乎你使用什么文本编辑器?这与问题无关。你不明白其中的区别吗?
  • 那不是构造函数,它返回一个 void 并且它可能甚至不在类中
  • 与 Gavriel 所说的一样,我强烈建议不要将方法命名为与类名相同的名称。对于阅读代码的人来说非常混乱。
  • Android Button Onclick的可能重复

标签: java android-fragments


【解决方案1】:

这里的问题是:

在父或祖先上下文中找不到方法 ProgramiPowerlifting5x5(View)

onClick 属性引用父 Context(作为父 Activity),因此片段的方法不会被此属性触发和处理。
您必须处理 Activity 中的点击:

public class ProgramiPowerlifting5x5 extends AppCompatActivity {
    ...
    // change the method's name to avoid confusion with constuctor
    public void ProgramiPowerLifting(View view){
        Intent intent = new Intent(this, ProgramiPowerlifting5x5.class);
        startActivity(intent);
    }
}

或者在你的片段中触发相同的方法:

public class ProgramiPowerlifting5x5 extends AppCompatActivity {
    private ProgramPowerFragment fragment;
    ...
    public void ProgramiPowerLifting(View view){
        fragment.ProgramiPowerLifting(view);
    }
}

This great answer 使用回调接口,我个人建议这样做。或者您可以轻松忘记 onClick xml 属性并使用 setOnClickListener() 动态执行此操作。
所以,让我们尝试一下简单的方法:

public class FragmentPowerlifting extends Fragment {

    public FragmentPowerlifting() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // store the layout in a view variable
        View v = inflater.inflate(R.layout.fragment_powerlifting, container, false);
        // use this view ("v") to retrieve elements on the layout by its id
        ImageButton imgButton = (ImageButton) v.findViewById(R.id.btnProgramiPL5x5);
        // set a listener to the button
        imgButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // open a new activity when onClick is triggered
                Intent intent = new Intent(getActivity(), ProgramiPowerLiftingActivity.class);
                startActivity(intent);
            }
        }
        // return the inflated view to display it
        return v;
   }
} 

【讨论】:

  • 很抱歉,但这些都没有帮助。仍然遇到同样的错误
  • 很抱歉听到@DaxHR。但即使通过测试发布链接中的其他答案?
  • 没有。不知道为什么,为什么和从活动开始新活动的过程不一样?可能 onClick 对错误负责吗?我应该使用 onClickListener 吗?
  • @DaxHR 这不应该是问题所在的起始活动部分。尝试使用 onClickListener 是的,没有 xml 属性。
  • 我在尝试在 Fragment.java 中添加 onClickListener 时遇到错误。它无法识别 fingViewById
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多