AndroidはButterKnifeと組み合わせて独自のBaseActivityを作成(6.0対応)
13275 ワード
Androidの開発では、アプリ内のすべてのactivityを統一的に操作するためにBaseActivityを作成する必要があります.今日はButterKnifeと組み合わせて強化版のBaseActivityを作る方法についてお話しします.ButterKnifeに詳しくない方は、私のこの文章AndroidのButterKnifeの使い方を参考にして詳しく説明してください.
BaseActivity
我々のButterKnifeの各Activityにおけるバインドとデバインド操作は同じであるため,BaseActivity抽象クラスにカプセル化した.私たちの使用を見てみましょう.
ButterKnifeが入っているかどうかは、とても便利です
次はBaseFragmentを見てみましょう
実はBaseActivityとBaseFragmentの差は大きくなく、ButterKnifeで初期化に必要なのは少し違います.ここではあまり述べない.次に、究極版の6.0パーミッション操作に対応するBaseActivityについて説明します.
究極版6.0ランタイム権限対応BaseActivity
コードを説明します:1.まず、
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
private Unbinder mUnbinder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewResId());
mUnbinder = ButterKnife.bind(this);
init(savedInstanceState);
}
public abstract int getContentViewResId();
public abstract void init(Bundle savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
}
我々のButterKnifeの各Activityにおけるバインドとデバインド操作は同じであるため,BaseActivity抽象クラスにカプセル化した.私たちの使用を見てみましょう.
public class TestActivity extends BaseActivity {
@BindView(R.id.tv_test)
TextView mTextView;
@Override
public int getContentViewResId() {
// Activity contentViewId
return R.layout.activity_test;
}
@Override
public void init(Bundle savedInstanceState) {
//
}
}
ButterKnifeが入っているかどうかは、とても便利です
次はBaseFragmentを見てみましょう
public abstract class BaseFragment extends Fragment {
public static final String TAG = BaseFragment.class.getSimpleName();
private View mRootView;
private Unbinder mUnbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mRootView = inflater.inflate(getLayoutResId(), container, false);
mUnbinder = ButterKnife.bind(this, mRootView);
init(savedInstanceState);
return mRootView;
}
public abstract void init(Bundle savedInstanceState);
public abstract int getLayoutResId();
@Override
public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}
}
実はBaseActivityとBaseFragmentの差は大きくなく、ButterKnifeで初期化に必要なのは少し違います.ここではあまり述べない.次に、究極版の6.0パーミッション操作に対応するBaseActivityについて説明します.
究極版6.0ランタイム権限対応BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {
private Unbinder mUnbinder;
/**
*
*/
protected String[] mNeedPermissions = {
//
// : sd
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
};
private static final int PERMISSION_REQUEST_CODE = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewResId());
mUnbinder = ButterKnife.bind(this);
checkPermissions(mNeedPermissions);
init(savedInstanceState);
}
/**
* @param permissions
*/
private void checkPermissions(String... permissions) {
List needRequestPermissionList = findDeniedPermissions(permissions);
if (null != needRequestPermissionList
&& needRequestPermissionList.size() > 0) {
ActivityCompat.requestPermissions(this,
needRequestPermissionList.toArray(
new String[needRequestPermissionList.size()]),
PERMISSION_REQUEST_CODE);
}
}
/**
*
*
* @param permissions
* @return
*/
private List findDeniedPermissions(String[] permissions) {
List needRequestPermissionList = new ArrayList();
for (String perm : permissions) {
if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) {
needRequestPermissionList.add(perm);
}
}
return needRequestPermissionList;
}
/**
*
*
* @param grantResults
* @return
*/
private boolean verifyPermissions(int[] grantResults) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
*
*
*/
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.notifyTitle);
builder.setMessage(R.string.notifyMsg);
// ,
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setPositiveButton(R.string.setting,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.setCancelable(false);
builder.show();
}
/**
*
*
*/
private void startAppSettings() {
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (!verifyPermissions(grantResults)) {
showMissingPermissionDialog();
}
}
}
public abstract int getContentViewResId();
public abstract void init(Bundle savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
}
コードを説明します:1.まず、
onCreate
でcheckPermissions(mNeedPermissions)
を通じて必要な権限をチェックし、checkPermissions
でfindDeniedPermissions
を呼び出して申請する必要がある権限を探し、ActivityCompat.requestPermissions
を呼び出して申請権限を呼び出します.申請権限はonRequestPermissionsResult
で戻り、verifyPermissions
を呼び出してすべての権限が許可されているかどうかを確認します.showMissingPermissionDialog
が呼び出されなければ、ユーザ権限が確実であることを通知する.最後に、BaseActivityを継承し、mNeedPermissionsというメンバー変数を書き換えるだけで使用できます.申請権限が必要なActivityに膨大なコードを書く必要はありません.BaseFragmentはBaseActivityと同じですよ!