简体   繁体   English

需要片段帮助(Android)

[英]Need Help in Fragments(Android)

I have newly started learning android.我刚开始学习android。 So i was doing the topic fragment, when i decided to create a fragment on my own,The following is the code that i wrote.所以我在做主题片段,当我决定自己创建一个片段时,以下是我写的代码。 However on running the code the emulator shows "fragment2 has stopped ".但是在运行代码时,模拟器显示“fragment2 已停止”。 Please have a look at my code and tell me where i am going wrong.请查看我的代码并告诉我哪里出错了。 Thanks in advance.提前致谢。

1.fragment 1.片段

package com.example.adi.fragment2;

import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main,container,false);
        final EditText editText = (EditText)view.findViewById(R.id.editText);
        final TextView textView = (TextView)view.findViewById(R.id.textView);
        Button button = (Button) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(editText.getText().toString());
            }
        });
        return view;
    }
}

2.main launcher activity 2.主启动器活动

package com.example.adi.fragment2;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;



public class Launcher extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.box);
        if(fragment==null) {
            fragment = new MainActivity();
            fm.beginTransaction().add(R.id.box, fragment).commit();
        }
    }
}

edit:Here is the log status编辑:这是日志状态

01-07 06:05:26.423 2183-2183/? I/art: Late-enabling -Xcheck:jni
01-07 06:05:26.423 2183-2183/? W/art: Unexpected CPU variant for X86 using defaults: x86
01-07 06:05:26.550 2183-2183/com.example.adi.fragment2 W/System: ClassLoader referenced unknown path: /data/app/com.example.adi.fragment2-2/lib/x86
01-07 06:05:26.573 2183-2183/com.example.adi.fragment2 I/InstantRun: Instant Run Runtime started. Android package is com.example.adi.fragment2, real application class is null.
01-07 06:05:26.944 2183-2183/com.example.adi.fragment2 W/System: ClassLoader referenced unknown path: /data/app/com.example.adi.fragment2-2/lib/x86
01-07 06:05:26.985 2183-2183/com.example.adi.fragment2 D/AndroidRuntime: Shutting down VM
01-07 06:05:26.986 2183-2183/com.example.adi.fragment2 E/AndroidRuntime: FATAL EXCEPTION: main
             Process: com.example.adi.fragment2, PID: 2183
             java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.adi.fragment2/com.example.adi.fragment2.MainActivity}: java.lang.ClassCastException: com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548)
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
                 at android.app.ActivityThread.-wrap12(ActivityThread.java)
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
                 at android.os.Handler.dispatchMessage(Handler.java:102)
                 at android.os.Looper.loop(Looper.java:154)
                 at android.app.ActivityThread.main(ActivityThread.java:6077)
                 at java.lang.reflect.Method.invoke(Native Method)
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
              Caused by: java.lang.ClassCastException: com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity
                 at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538)
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
                 at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                 at android.os.Looper.loop(Looper.java:154) 
                 at android.app.ActivityThread.main(ActivityThread.java:6077) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

I do not have full code so I cannot be 100% sure.我没有完整的代码,所以我不能 100% 确定。 But instead of add try to use replace on the fragment manager might fix it if there already is a default fragment shown below.但是如果已经有如下所示的默认片段,而不是添加尝试在片段管理器上使用替换可能会修复它。

Change改变

fm.beginTransaction().add(R.id.box, fragment).commit();

To

fm.beginTransaction().replace(R.id.box, fragment).commit();

You didn't add FragmentTransaction to your code.您没有将 FragmentTransaction 添加到您的代码中。

Don't forget to import不要忘记导入

Do this in your onCreate menthod在您的 onCreate 方法中执行此操作

FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.content_frame, fragment);//add this only if add() doesn't work
        ft.commit();

Don't forget to import不要忘记导入

import android.support.v4.app.FragmentTransaction;

And make sure that you have imported this class only for all the methods并确保您仅为所有方法导入了此类

This class allows you to have backward compatibility for previous versions.此类允许您对以前的版本具有向后兼容性。

This Should solve it.这应该解决它。 Happy Coding.快乐编码。

Have a close look at仔细看看

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.adi.fragment2/com.example.adi.fragment2.MainActivity}: java.lang.ClassCastException: com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity

It says com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity .它说com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity Your MainActivity is actually a Fragment你的MainActivity实际上是一个Fragment

public class MainActivity extends Fragment{

}

Use meaningful name for your classes.为您的类使用有意义的名称。

This is the magical Log Line :这是神奇的日志行:

java.lang.ClassCastException: com.example.adi.fragment2.MainActivity cannot be cast to android.app.Activity

Basically your main activity is extending FragmentActivity class, and i assume that in your fragment Xml file you are using android.app.Fragment基本上你的主要活动是扩展 FragmentActivity 类,我假设在你的片段 Xml 文件中你正在使用android.app.Fragment

You can also refer to this answer for further info您也可以参考此答案以获取更多信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM