-1

I have newly started learning 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 ". Please have a look at my code and tell me where i am going wrong. Thanks in advance.

1.fragment

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

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) 
Haris Qurashi
  • 2,104
  • 1
  • 13
  • 28
hamster
  • 29
  • 6

4 Answers4

0

I do not have full code so I cannot be 100% sure. 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();
koksalb
  • 430
  • 8
  • 14
0

You didn't add FragmentTransaction to your code.

Don't forget to import

Do this in your onCreate menthod

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.

0

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. Your MainActivity is actually a Fragment

public class MainActivity extends Fragment{

}

Use meaningful name for your classes.

Haris Qurashi
  • 2,104
  • 1
  • 13
  • 28
0

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

You can also refer to this answer for further info

Community
  • 1
  • 1
AouledIssa
  • 2,528
  • 2
  • 22
  • 39