0
点赞
收藏
分享

微信扫一扫

Android 自定义BaseActivity,BaseFragment

Separes 2021-09-26 阅读 53

一、需求分析

项目中的activity存在大量相同的方法和变量生命,且在activity的初始化方法中,也有部分代码相同,为方便管理和使用activity,因此自定义一个适用自己的BaseActivity,在这里,BaseActivity不包含任何页面内容。

二、代码实现

第一部分:BaseActivity

新建一个class名为“BaseActivity”,内容如下。代码中已有注释,这里不在说明。

public abstract class BaseActivity< B extends ViewBinding > extends AppCompatActivity {
    protected B view;
    private LoadDialog loadDialog;
    protected Activity activity;
    protected Handler handler;

    @Override
    protected void onCreate ( @Nullable Bundle savedInstanceState ) {
        super.onCreate ( savedInstanceState );
        activity = this;
        handler = new Handler ( Looper.getMainLooper ( ) );
        loadDialog = new LoadDialog ( activity );
        view = setView ( );
        if ( view != null ) {
            setContentView ( view.getRoot ( ) );
        }
        onCreate ( );
    }

    /**
     * 设置内容
     *
     * @return v
     */
    public abstract B setView ( );

    /**
     * 初始化
     */
    public abstract void onCreate ( );

    /**
     * 显示加载框
     *
     * @param message 内容
     */
    public void showLoad ( String message ) {
        loadDialog.showloading ( message );
    }

    /**
     * 关闭加载框
     */
    public void closeLoad ( ) {
        loadDialog.dismiss ( );
    }

    /**
     * 吐司
     *
     * @param s 吐司内容
     */
    public void toast ( String s ) {
        Toast.makeText ( activity, s, Toast.LENGTH_SHORT ).show ( );
    }

    /**
     * 打开activity
     *
     * @param mClass mClass
     */
    public void openActivity ( Class< ? > mClass ) {
        startActivity ( new Intent ( activity, mClass ) );
    }

    /**
     * 打开activity
     *
     * @param mClass mclass
     * @param code   code
     */
    public void openActivity ( Class< ? > mClass, int code ) {
        startActivityForResult ( new Intent ( activity, mClass ), code );
    }

    /**
     * 打开activity
     *
     * @param intent intent
     */
    public void openActivity ( Intent intent ) {
        startActivity ( intent );
    }

    /**
     * 打开activity
     *
     * @param intent intent
     * @param code   code
     */
    public void openActivity ( Intent intent, int code ) {
        startActivityForResult ( intent, code );
    }

    @Override
    protected void onDestroy ( ) {
        super.onDestroy ( );
        handler.removeCallbacksAndMessages ( null );
    }
}

至此,BaseActivity已经建立完毕,接下来就是使用它。新建MainActivity(包括xml布局文件)。使用方法非常简单。

public class MainActivity extends BaseActivity< ActivityMainBinding > {
    @Override
    public ActivityMainBinding setView ( ) {
        return ActivityMainBinding.inflate ( getLayoutInflater ( ) );
    }

    @Override
    public void onCreate ( ) {
        view.tvTitle.setText("你好,Android!");
    }
}

MainActivity对应的xml布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

第二部分:BaseFragment

新建一个class名为BaseFragment,内容如下

public abstract class BaseFragment< B extends ViewBinding > extends Fragment {
    protected LayoutInflater inflater;
    protected ViewGroup container;
    protected B view;
    private LoadDialog loadDialog;
    protected final Activity activity;

    public BaseFragment ( Activity activity ) {
        this.activity = activity;
    }

    @Nullable
    @Override
    public View onCreateView ( @NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                               @Nullable Bundle savedInstanceState ) {
        this.inflater = inflater;
        this.container = container;
        view = setView ( );
        loadDialog = new LoadDialog ( activity );
        onCreate ( );
        return view.getRoot ( );
    }
    //忽略跟BaseActivity一样的内容
}

使用方法,新建一个IndexFragment 继承BaseFragment。

public class IndexFragment extends BaseFragment< FragmentIndexBinding > {

    public IndexFragment ( Activity activity ) {
        super ( activity );
    }

    @Override
    public FragmentIndexBinding setView ( ) {
        return FragmentIndexBinding.inflate ( inflater, container, true );
    }

    @Override
    public void onCreate ( ) {
    }
}

三、注意事项

1、以上代码实现,请使用viewBinding。

android {
    ······
    buildFeatures {
        viewBinding = true
    }
}

2、base可以预先定义一个容器,如统一的标题,返回键等。获取到子页面的viewbinding后,用view.addView();方法即可。如遇到layoutParams为空的情况,请在base中做处理。
3、BaseFragment为避免activity为空,这里直接使用mainActivity。

四、总结

1、通过以上方式建立的BaseActivity和BaseFragment,相对而言,代码量少很多。而且base中声明的方法很明确不容易出错。不像别的方法如init(),main();doWork();doStart();容易混淆,稍有不慎可能还会导致空指针。
2、ViewBinding为android程序猿节省了不少时间,新项目或在条件允许下,建议更换成它。

举报

相关推荐

0 条评论