I wanted to take the code from an activity, both the xml and the java and use it to create a fragment that is the exact same as the activities design and functionality. I have checked the docs (https://developer.android.com/guide/components/fragments.html) several times about Fragments and also watched tons of youtube videos about it. I literally copy and pasted the code from my activity.java file and pasted it directly into my fragment.java file then I made changes to the code that was there. But, I believe I have a misconception about Fragments.
Just to give a better scope of what error I have been getting I have been getting NullPointerExceptions like crazy.
My original java file for my original activity works perfectly, as does the xml.
package com.example.me.inserttitlename;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.view.InflateException;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
* A simple {@link Fragment} subclass.
*/
public class LevelOneFragment extends Fragment {
//creating variables
private ImageView img;
private ViewGroup viewer;
TextView textCount;
Button failButton;
Button beginButton;
TextView countDownBeginText;
private TextView countDownMain;
public int scoreCounter;
public LevelOneFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
super.onActivityCreated(savedInstanceState);
//setCont(R.layout.fragment_level_one);
// return inflater.inflate(R.layout.fragment_level_one,container, false);
View view = inflater.inflate(R.layout.fragment_level_one, container, true);
//creating viewables and such
viewer = (ViewGroup) view.findViewById(R.id.view_level);
img = (ImageView) view.findViewById(R.id.imageView);
failButton = (Button) view.findViewById(R.id.failureButton);
countDownMain = (TextView) view.findViewById(R.id.countDownMain);
countDownBeginText = (TextView) view.findViewById(R.id.countDownBeginText);
beginButton = (Button) view.findViewById(R.id.beginButton);
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
}
try {
view = inflater.inflate(R.layout.fragment_level_one, container, false);
} catch (InflateException e) {
}
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
img.setLayoutParams(layoutParams);
img.setOnTouchListener(new LevelOneFragment.ChoiceTouchListener());
//begin random movement
startRandomButton(img);
//setting up button for failure CORRECT TO TAKE YOU TO THE MAIN MENU
failButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
startActivity(new Intent(getActivity(), MainMenu.class));
}
});
//setting countdown text to 3
countDownBeginText.setText(":3");
//begin countdown from three
beginButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View beginT) {
CountDownTimer countDownTimer = new CountDownTimer(3*1000, 3) {
@Override
public void onTick(long millisUntilFinished) {
countDownBeginText.setText(":" + millisUntilFinished/1000);
//add possible sound here every tick
}
@Override
public void onFinish() {
beginButton.setVisibility(View.INVISIBLE);
countDownBeginText.setVisibility(View.INVISIBLE);
//countdown from 60------- change parameters in count down timer to the time desired
CountDownTimer countDownTimer = new CountDownTimer(60*1000, 3) {
@Override
public void onTick(long millisUntilFinishedMain) {
countDownMain.setText(":" + millisUntilFinishedMain/1000);
//add possible sound here every tick
}
@Override
public void onFinish() {
Toast.makeText(getActivity(),"You lose", Toast.LENGTH_LONG).show();
//rest of text in method is trial
startActivity(new Intent(getActivity(), MainMenu.class ));
}
}.start();
}
}.start();
}
});
return view; //inflater.inflate(R.layout.fragment_level_one,container, false);
}
//getting screen size
public static Point getDisplaySize(@NonNull Context context){
Point point = new Point();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getSize(point);
return point;
}
//randomly move
public void randomMovement(ImageView img){
int x = new Random().nextInt(getDisplaySize(getActivity()).x);
int y = new Random().nextInt(getDisplaySize(getActivity()).y);
img.setY(y);
img.setX(x);
}
//creating timer
public void startRandomButton(final ImageView img){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() { //best method in the entire world-- use when trying to update ui in the background
@Override
public void run() {
randomMovement(img);
}
});
}
}, 0, 5000);
}
//listener for the moving ball
private final class ChoiceTouchListener implements View.OnTouchListener {
public boolean onTouch(View view, MotionEvent event){
//Calling Counter
textCount = (TextView) getView().findViewById(R.id.textViewCount);
//switch statement for different events
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
//this is where youre going to generate randmom location with id.setX(randomX) and id.setY(randomY)
randomMovement(img);
//Setting Counter to count when img is clicked
String countValue = textCount.getText().toString();
scoreCounter = Integer.parseInt(countValue);
scoreCounter++;
textCount.setText(String.valueOf(scoreCounter));
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
}
//checking score
if(scoreCounter == 10 )
{
Toast.makeText(getActivity(),"You win", Toast.LENGTH_LONG).show();
}
viewer.invalidate();
return true;
}
}
}
As you can see the code posted above is my java code for my fragment. Below is the xml for the fragment.
<?xml version="1.0" encoding="utf-8"?>
<!-- TODO: Update blank fragment layout -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/view_level"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/levelbackgroundoptiontwo"
tools:context="com.example.name.inserttitlename.LevelOneFragment"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="81dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/failureButton"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:background="@drawable/levelbackgroundoptiontwo"
android:visibility="visible" />
</RelativeLayout>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:text="Version: 0.0.12"
android:textColor="#Ef9A9A"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1" />
<ImageView
android:id="@+id/imageView"
android:layout_width="61dp"
android:layout_height="80dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="66dp"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/clickerobject"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textViewCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:fontFamily="casual"
android:text="0"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold" />
<TextView
android:id="@+id/levelCounter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textViewCount"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:fontFamily="casual"
android:text="Level: 1"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold" />
<TextView
android:id="@+id/countDownMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/levelCounter"
android:layout_centerHorizontal="true"
android:fontFamily="casual"
android:text="60"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/beginButton"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="#80363636"
android:fontFamily="casual"
android:text="Tap anywhere to begin"
android:textColor="@android:color/white"
android:textSize="30sp"
android:textStyle="bold"
android:visibility="visible" />
</RelativeLayout>
<TextView
android:id="@+id/countDownBeginText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="213dp"
android:text="TextView"
android:textColor="@android:color/white"
android:textSize="35sp"
android:textStyle="bold"
android:visibility="visible"
tools:text="3" />
</RelativeLayout>
Also here is where I am calling the fragment.
package com.example.name.insertitlename;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.widget.Button;
import android.widget.Toast;
/**
* Created by Marcus
*/
public class LevelsMenu extends FragmentActivity {
Button levelOne;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.levels_menu);
//creating the buttons
//Button levelOne;
//setting the button equal to buttons found on levels_menu.xml
levelOne = (Button) findViewById(R.id.levelone);
//button listener surrounding fragment call
levelOne.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
LevelOneFragment fragment = new LevelOneFragment();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.levelsMainLayout, fragment, fragment.getTag()).commit();
}
});
}
}
Here is my logcat:
10-22 01:02:03.174 3165-3341/com.example.jon.tapmeifyoucan E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.example.jon.tapmeifyoucan, PID: 3165
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
at com.example.jon.tapmeifyoucan.LevelOneFragment$3.run(LevelOneFragment.java:162)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
10-22 01:02:03.290 3165-3183/com.example.jon.tapmeifyoucan D/EGL_emulation: eglMakeCurrent: 0xa77050c0: ver 3 0 (tinfo 0xa7703210)
10-22 01:02:03.374 3165-3183/com.example.jon.tapmeifyoucan D/EGL_emulation: eglMakeCurrent: 0xa77050c0: ver 3 0 (tinfo 0xa7703210)
I am not sure where I am going wrong. I could really use some help and maybe even some more clarification on fragments. For those who wanted to reference the original java code on the original activity it is posted below
//this consists of all the game logic
package com.example.name.insertitlename;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.CountDownTimer;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
//creating variables
private ImageView img;
private ImageView lava;
private ViewGroup rootLayout;
TextView textCount;
Button failButton;
Button beginButton;
TextView countDownBeginText;
private TextView countDownMain;
public int scoreCounter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//creating viewables
rootLayout = (ViewGroup) findViewById(R.id.view_root);
img = (ImageView) rootLayout.findViewById(R.id.imageView);
failButton = (Button) rootLayout.findViewById(R.id.failureButton);
countDownMain = (TextView) findViewById(R.id.countDownMain);
countDownBeginText = (TextView) findViewById(R.id.countDownBeginText);
beginButton = (Button) findViewById(R.id.beginButton);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
img.setLayoutParams(layoutParams);
img.setOnTouchListener(new ChoiceTouchListener());
//begin random movement
startRandomButton(img);
//setting up button for failure CORRECT TO TAKE YOU TO THE MAIN MENU
failButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
startActivity(new Intent(MainActivity.this, MainMenu.class));
}
});
//setting countdown text to 3
countDownBeginText.setText(":3");
//begin countdown from three
beginButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View beginT) {
CountDownTimer countDownTimer = new CountDownTimer(3*1000, 3) {
@Override
public void onTick(long millisUntilFinished) {
countDownBeginText.setText(":" + millisUntilFinished/1000);
//add possible sound here every tick
}
@Override
public void onFinish() {
beginButton.setVisibility(View.INVISIBLE);
countDownBeginText.setVisibility(View.INVISIBLE);
//countdown from 60------- change parameters in count down timer to the time desired
CountDownTimer countDownTimer = new CountDownTimer(60*1000, 3) {
@Override
public void onTick(long millisUntilFinishedMain) {
countDownMain.setText(":" + millisUntilFinishedMain/1000);
//add possible sound here every tick
}
@Override
public void onFinish() {
Toast.makeText(MainActivity.this,"You lose", Toast.LENGTH_LONG).show();
//rest of text in method is trial
startActivity(new Intent(MainActivity.this, MainMenu.class ));
}
}.start();
}
}.start();
}
});
}
//getting screen size
public static Point getDisplaySize(@NonNull Context context){
Point point = new Point();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getSize(point);
return point;
}
//randomly move
public void randomMovement(ImageView img){
int x = new Random().nextInt(getDisplaySize(this).x);
int y = new Random().nextInt(getDisplaySize(this).y);
img.setY(y);
img.setX(x);
}
//creating timer
public void startRandomButton(final ImageView img){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() { //best method in the entire world-- use when trying to update ui in the background
@Override
public void run() {
randomMovement(img);
}
});
}
}, 0, 5000);
}
//listener for the moving ball
private final class ChoiceTouchListener implements OnTouchListener{
public boolean onTouch(View view, MotionEvent event){
//Calling Counter
textCount = (TextView) findViewById(R.id.textViewCount);
//switch statement for different events
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
//this is where youre going to generate randmom location with id.setX(randomX) and id.setY(randomY)
randomMovement(img);
//Setting Counter to count when img is clicked
String countValue = textCount.getText().toString();
scoreCounter = Integer.parseInt(countValue);
scoreCounter++;
textCount.setText(String.valueOf(scoreCounter));
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
}
//checking score
if(scoreCounter == 10 )
{
Toast.makeText(MainActivity.this,"You win", Toast.LENGTH_LONG).show();
}
rootLayout.invalidate();
return true;
}
}
}