Search code examples
android-studioandroid-fragmentsbuttonandroid-activity

Open new activity by Clicking button in a Fragment


I'm currently working on a mobile app as a final project for my course. I have these two fragments inside a ViewPager2 controlled by a TabLayout. There are buttons inside of these fragments.

The first frag contains 2 buttons. The other frag has only one button. I want them to open an activity but the problem is when I run the app, these buttons won't work. They didn't open the other activity.

Login Fragment

package com.example.biowit;

import android.content.Intent;
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 androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.blogspot.atifsoftwares.animatoolib.Animatoo;

public class LoginTabFragment extends Fragment {

EditText email, password;
Button btn_login, btn_forpass;
TextView textView;
float v=0;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.login_fragment, container, false);
    email = root.findViewById(R.id.input_LI_email);
    password = root.findViewById(R.id.input_LI_pass);
    btn_forpass = root.findViewById(R.id.btn_FPass);
    btn_login = root.findViewById(R.id.btn_LIn);

    email.setTranslationX(800);
    password.setTranslationX(800);
    btn_forpass.setTranslationX(800);
    btn_login.setTranslationX(800);

    email.setAlpha(v);
    password.setAlpha(v);
    btn_forpass.setAlpha(v);
    btn_login.setAlpha(v);

    email.animate().translationX(0).alpha(1).setDuration(800).setStartDelay(300).start();
    password.animate().translationX(0).alpha(1).setDuration(800).setStartDelay(300).start();
    btn_forpass.animate().translationX(0).alpha(1).setDuration(800).setStartDelay(300).start();
    btn_login.animate().translationX(0).alpha(1).setDuration(800).setStartDelay(300).start();

    btn_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), HomeScreen.class);
            startActivity(intent);
            Animatoo.animateFade(getActivity());
            getActivity().finish();

        }
    });

    return root;
}
}

LoginScreen (where the fragment locates)

package com.example.biowit;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;

import com.google.android.material.tabs.TabItem;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

public class
LoginScreen extends AppCompatActivity {
TabLayout tabLayout;
ViewPager2 viewPager;
float v=1;

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

    tabLayout = findViewById(R.id.tab_layout);
    viewPager = findViewById(R.id.view_pager);

    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    
    LoginAdapter login_adapter = new LoginAdapter(this);
    viewPager.setAdapter(login_adapter);
    
    new TabLayoutMediator(tabLayout, viewPager,
            new TabLayoutMediator.TabConfigurationStrategy() {
                @Override
                public void onConfigureTab(@NonNull  TabLayout.Tab tab, int position) {
                    switch (position){
                        case 0:
                            tab.setText("LOGIN");
                            break;
                        case 1:
                            tab.setText("SIGNUP");
                            break;
                    }
                }
            }).attach();
    tabLayout.setAlpha(v);
}
}

Here's the error log(?)

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.biowit, PID: 18551
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.biowit/com.example.biowit.HomeScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.hide()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3754)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:239)
    at android.app.ActivityThread.main(ActivityThread.java:8212)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.hide()' on a null object reference
    at com.example.biowit.HomeScreen.onCreate(HomeScreen.java:22)
    at android.app.Activity.performCreate(Activity.java:8119)
    at android.app.Activity.performCreate(Activity.java:8103)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1359)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3727)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:239) 
    at android.app.ActivityThread.main(ActivityThread.java:8212) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016) 

HomeScreen (Activity that supposedly open when clicking the button)

package com.example.biowit;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;

import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class HomeScreen extends AppCompatActivity {

Button Chap1_btn, Achieve_btn, HowToPlay_btn, LogOut_btn, Settings_btn;

@Override
protected void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getSupportActionBar().hide(); // hides the action bar.

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_screen);

    Chap1_btn = findViewById(R.id.btn_Chap1);
    Achieve_btn = findViewById(R.id.btn_Achievements);
    HowToPlay_btn = findViewById(R.id.btn_HowToPlay);
    LogOut_btn = findViewById(R.id.btn_Logout);
    Settings_btn = findViewById(R.id.btn_Settings);

    Chap1_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent open_Chap1 = new Intent(getApplicationContext(), LessonScreen.class);
            startActivity(open_Chap1);
        }
    });

    Achieve_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Intent open_Achievements = new Intent(getApplicationContext(), Achievements.class);
        }
    });

    HowToPlay_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Intent open_HowToPlay = new Intent(getApplicationContext().HowToPlay.class);
        }
    });

    LogOut_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


        }
    });

    Settings_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent open_Settings = new Intent(getApplicationContext(), Settings.class);
            startActivity(open_Settings);
        }
    });
}
}

Solution

  • getSupportActionBar().hide(); is what's causing the error. You have added it before

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_screen);
    

    So it's trying to execute it before the activity is initialised.

    Add it after the above 2 lines and it should work.