Android中application 全局变量 && 使用TAB页不能退出的问题

本文介绍如何在Android应用中利用Application类存储全局变量,并通过在退出按钮处调用特定方法来关闭所有Activity实例,从而实现资源的合理释放。
 

android编程中,application这样的名词似乎变得那样的不常见,而让大家更为熟悉的是activity、intent、 provider、broadcast和service。但其实android中的application也有着它自身的用处。打开manifest文 件,会看到有一个application配置标签,这就是有关application的使用了。

就是说application是用来保存全局变量的,并且是在package创建的时候就跟着存在了。所以当我们需要创建全局变量的时候,不需要再像j2se那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的getApplicationContext 或者Activity的getApplication 方法来获得一个application对象,再做出相应的处理。

退出按钮实现

首先,创建Application来存储所有打开的Activity的list。代码如下:

package com.deaboway.view;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Application;
public class Deaboway extends Application {
private List < Activity > mainActivity = new ArrayList < Activity > ();
public List < Activity > MainActivity() {
return mainActivity;
}
public void addActivity(Activity act) {
mainActivity.add(act);
}
public void finishAll() {
for (Activity act : mainActivity) {
if ( ! act.isFinishing()) {
act.finish();
}
}
mainActivity
= null ;
}
}

其次,在所有Activity的 @Override public void onCreate(Bundle savedInstanceState) {}方法中加上:

public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
Deaboway appState
= (Deaboway) this .getApplication();
appState.addActivity(
this );
setContentView(R.layout.main);
。。。。。。。

第三,在退出按钮的地方调用:

OnClickListener() {
public void onClick(View v) {
Deaboway appState
= (Deaboway)getApplicationContext();
appState.finishAll();
}
}

最后,要记得在manifest中的application标签中添加 android:name=".Deaboway"


请优化以下android代码:main.java :package com.example.myapplication.Fragment; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.viewpager.widget.ViewPager; import com.example.myapplication.R; import com.example.myapplication.Viewpagerhd.Mypageradapter; import java.util.ArrayList; import java.util.List; public class Fragment_main extends AppCompatActivity implements View.OnClickListener { private Fragment fragment1, fragment2, fragment3; private TextView tab1, tab2, tab3; private ViewPager myViewpager; private List<Fragment> fragmentList; private Mypageradapter mypageradapter; private Fragment currentFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment1); initUI(); // initFragments(); initTab(); } private void initTab() { fragmentList = new ArrayList<Fragment>(); fragmentList.add(new Fragmenta_1()); fragmentList.add(new Fragmenta_2()); fragmentList.add(new Fragmenta_3()); // 使用修正后的适配器 mypageradapter = new Mypageradapter(getSupportFragmentManager(), fragmentList); myViewpager.setAdapter(mypageradapter); myViewpager.addOnPageChangeListener(new MyPageChangeListennr()); // 修正监听器设置 showFragment(0); } private void showFragment(int i) { myViewpager.setCurrentItem(i); if (i == 0){ tab1.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (i==1){ tab2.setBackgroundColor(Color.RED); tab1.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (i==2){ tab3.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab1.setBackgroundColor(Color.WHITE); } } public class MyPageChangeListennr implements ViewPager.OnPageChangeListener { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position==0){ tab1.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (position==1){ tab2.setBackgroundColor(Color.RED); tab1.setBackgroundColor(Color.WHITE); tab3.setBackgroundColor(Color.WHITE); }else if (position==2){ tab3.setBackgroundColor(Color.RED); tab2.setBackgroundColor(Color.WHITE); tab1.setBackgroundColor(Color.WHITE); } } @Override public void onPageScrollStateChanged(int state) { } } private void initUI() { tab1 = findViewById(R.id.T1); tab2 = findViewById(R.id.T2); tab3 = findViewById(R.id.T3); tab1.setOnClickListener(this); tab2.setOnClickListener(this); tab3.setOnClickListener(this); myViewpager =(ViewPager) findViewById(R.id.myviewpage); // updateTabColors(R.id.T1); } // private void initFragments() { // FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // // // 按顺序添加所有Fragment // fragment1 = new Fragmenta_1(); // fragment2 = new Fragmenta_2(); // fragment3 = new Fragmenta_3(); // // transaction.add(R.id.view_pager, fragment1, "1"); // transaction.add(R.id.view_pager, fragment2, "2"); // transaction.add(R.id.view_pager, fragment3, "3"); // // transaction.hide(fragment2); // transaction.hide(fragment3); // transaction.commitNow(); // 立即提交事务 // // currentFragment = fragment1; // } @Override public void onClick(View v) { if (v.getId()==R.id.T1) { showFragment(0); }else if (v.getId()==R.id.T2){ showFragment(1); }else if (v.getId()==R.id.T3){ showFragment(2); } } private void switchFragment(Fragment targetFragment, int tabId) { if (targetFragment == currentFragment) return; FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); transaction.hide(currentFragment); transaction.show(targetFragment); transaction.commitNow(); // 使用立即提交 currentFragment = targetFragment; updateTabColors(tabId); } private void updateTabColors(int selectedTabId) { int defaultColor = Color.WHITE; int selectedColor = Color.RED; tab1.setBackgroundColor(selectedTabId == R.id.T1 ? selectedColor : defaultColor); tab2.setBackgroundColor(selectedTabId == R.id.T2 ? selectedColor : defaultColor); tab3.setBackgroundColor(selectedTabId == R.id.T3 ? selectedColor : defaultColor); } } 适配器:package com.example.myapplication.Fragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import java.util.List; public class Mypageradapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; public Mypageradapter(FragmentManager fm) { super(fm); } public Mypageradapter(FragmentManager fm, List<Fragment>fragmentList) { super(fm); this.fragmentList=fragmentList; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } } 运行日志:2025-05-29 13:58:01.366 22820-22820/? E/e.myapplicatio: Unknown bits set in runtime_flags: 0x8000 2025-05-29 13:58:02.024 22820-22820/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 22820 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.Fragment.Fragment_main}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 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:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.example.myapplication.Viewpagerhd.Mypageradapter.getCount(Mypageradapter.java:40) at androidx.viewpager.widget.ViewPager.setAdapter(ViewPager.java:532) at com.example.myapplication.Fragment.Fragment_main.initTab(Fragment_main.java:46) at com.example.myapplication.Fragment.Fragment_main.onCreate(Fragment_main.java:35) at android.app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)  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:2016)  at android.os.Handler.dispatchMessage(Handler.java:107)  at android.os.Looper.loop(Looper.java:214)  at android.app.ActivityThread.main(ActivityThread.java:7356)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)  运行时,代码没有报错,但是应用打不开,只是闪一下就退出
最新发布
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值