Android 自定义BaseActivity,BaseFragment

时间:2021-6-5 作者:qvyue

一、需求分析

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

二、代码实现

第一部分:BaseActivity

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

public abstract class BaseActivity 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 {
    @Override
    public ActivityMainBinding setView ( ) {
        return ActivityMainBinding.inflate ( getLayoutInflater ( ) );
    }

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

MainActivity对应的xml布局文件如下

第二部分:BaseFragment

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

public abstract class BaseFragment 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 {

    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程序猿节省了不少时间,新项目或在条件允许下,建议更换成它。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。