【问题标题】:Fragment to Activity片段到活动
【发布时间】:2016-07-01 23:08:21
【问题描述】:

我已经在片段中声明了一个按钮并与 XML 中的 onClick 属性挂钩。当我单击此片段中的按钮时,它应该重定向到另一个扩展活动的类文件。但不幸的是,应用程序停止了。

我的班级档案

public class ReadingBeginner extends Fragment{

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


public void Alpha(View v){
    Intent intent = new Intent(this,Alphabet.class);
    startActivity(intent);

}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.activity_reading_beginner, container, false);
}}

我在 xml 中的 bytton

    <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/Alpha"
    android:onClick="Alpha"
    android:id="@+id/alphas"
    android:textAlignment="textStart"
    android:background="@drawable/drawable"
    android:drawableLeft="@drawable/ic_alpha"
    android:drawablePadding="15dp"
    android:textAllCaps="false"

    />

这是我需要按钮重定向的类文件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Alphabet extends AppCompatActivity {

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

}

Logcat 错误

03-16 03:19:09.061 25450-25450/com.example.world.englishtutor E/AndroidRuntime: FATAL EXCEPTION: main
  java.lang.IllegalStateException: Could not find method Alpha(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'alphas'
  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325)
  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
  at android.view.View.performClick(View.java:4240)
  at android.view.View$PerformClick.run(View.java:17721)
  at android.os.Handler.handleCallback(Handler.java:730)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:5103)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:525)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你在哪里引用你的按钮并添加onClickListener()
  • 在你的意图中而不是使用this使用getActivity()

标签: java android android-fragments android-intent android-studio


【解决方案1】:

正如Doug 建议的那样。执行以下操作:

 Button button = (Button) root.findViewById(R.id.alphas);
    button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     Intent intent = new Intent(getActivity(),Alphabet.class);
                     startActivity(intent);
                }
            });

【讨论】:

    【解决方案2】:

    删除

    1. android:onClick="Alpha" in xml  
    2. 
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    }
    3.public void Alpha(View v){
    Intent intent = new Intent(this,Alphabet.class);
    startActivity(intent);
    }
    

    和 OnCreateView

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
     View root = inflater.inflate(R.layout.activity_reading_beginner, container,false);
    
    Button btn1 = (Button) root.findViewById(R.id.alphas);
    btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 Intent intent = new Intent(getActivity(),Alphabet.class);
        startActivity(intent);
            }
        });
    return root;
    }
    

    试试吧!

    【讨论】:

    • 像魅力一样工作:) 但是开始的新活动没有工具栏任何建议..?
    • 我不明白你的问题?
    • 很抱歉,刚刚开始的新活动 Alphabet.class 中缺少操作栏......
    【解决方案3】:

    首先你必须在片段中初始化你的按钮。

    你必须在这里使用 getActivity() 方法而不是这个!

    public void Alpha(View v){
        Intent intent = new Intent(getActivity(),Alphabet.class);
        startActivity(intent);
    
    }
    

    【讨论】:

      【解决方案4】:

      从 xml 中删除 onClick。然后 在片段类的 onCreateView() 方法中找到 Button。然后 在里面设置按钮的onClick()和startactivity。

      onCreate():

      Button btn = (Button) yourinflatedview.findviewbyid (R.id.alphas);
      btn.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                       Intent intent = new Intent(getActivity(),Alphabet.class);
              startActivity(intent);
                  }
              });
      

      【讨论】:

      • xml中的onClick会有什么问题?
      • 您可以在代码中编辑它吗?
      • 对不起,我听不懂
      • 如果他在 xml 中定义 onClick 并在片段中定义该方法并在其中正确传递意图会有什么问题
      • 好吧,我不太清楚,但我已经在 onCreateView 中使用 onClick 实现了相同的东西,这就是我建议这种方法的原因
      【解决方案5】:

      试试这个。

      从 xml 中删除 onclick

      <Button
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/Alpha"
          android:id="@+id/alphas"
          android:textAlignment="textStart"
          android:background="@drawable/drawable"
          android:drawableLeft="@drawable/ic_alpha"
          android:drawablePadding="15dp"
          android:textAllCaps="false"
      
          />
      

      在此之后将其放入 onCreateview。

      Button b = (Button) findviewbyid (R.id.alphas);
      bb2.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                       Intent intent = new Intent(getActivity(),Alphabet.class);
              startActivity(intent);
                  }
              });
      

      否则你改变 getActivity() 而不是 this

      Intent intent = new Intent(getActivity(),Alphabet.class);
              startActivity(intent);
      

      它将片段移动到活动中。 希望对你有帮助:)

      【讨论】:

        【解决方案6】:

        您的布局假设 Button 将在定义它的 activity 中调用一个名为“alpha”的方法。如果方法是在 fragment 中定义的,这将不起作用。

        相反,在您的片段中,您应该在视图层次结构中找到 Button 并在其上注册一个 OnClickListener 来执行您想要的操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多