我正在尝试减少使用重复代码的双重努力。我在谷歌搜索但没有发现我们如何减少android中的代码重复。可能这个问题可能很愚蠢,但我想澄清一下。
1)我想问的第一件事就是我们如何在覆盖方法中使用的多个活动中重用相同的代码onBackPressed()
onOptionsItemSelected()
等等。这是我目前用onBackPressed()
方法编写的代码。
@Override
public void onBackPressed(){
if(this.mDrawerLayout.isDrawerOpen(GravityCompat.START)){
this.mDrawerLayout.closeDrawer(GravityCompat.START);
}else{
super.onBackPressed();
}
}
对于此方法,我从this问题得到建议,使基本活动覆盖此方法,然后从该BaseActivity扩展其他活动。但是我如何在BaseActivity中传递mDrawerLayout
字段?我如何在该基本活动上使用findViewById()
访问xml小部件,以便在覆盖方法中访问当前使用mDrawerLayout
布局。
代码中的示例。
public BaseActivity extends AppCompatActivity{
private DrawerLayout mDrawerLayout; // how to initialize it? where to call findViewById?
@Override
public void onBackPressed(){
if(this.mDrawerLayout.isDrawerOpen(GravityCompat.START)){
this.mDrawerLayout.closeDrawer(GravityCompat.START);
}else{
super.onBackPressed();
}
}
}
onOptionsItemSelected()
表示菜单项操作的相同问题。
2)我面临的第二次重复是startActivity()
我必须写Intent
然后在需要时添加额外数据而不是使用该Intent。所以我要一次又一次地写2到3行。
3)这是关于XML的,我使用了值5dp
或10dp
或10sp
或其他dimen
值在XML文件中重复了很多时间。所以我想问一下这种方法会好吗?
<dimen name="ten_dp">10dp</dimen>
android:layout_margin="@dimen/ten_dp"
平均声明dp
值,然后在XML中使用它。
编辑:
4)我现在遇到的这个问题。我在所有活动中使用相同的工具栏,在以XML布局添加后,我必须编写此代码。
private void setupToolbar(){
setSupportActionBar(mainToolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
}
}
但我必须在所有活动中重新编写/复制代码。这个问题的解决方案是什么?
答案 0 :(得分:0)
1)对于您的第一个问题,您必须在mDrawerLayout
中使用BaseActivity
,然后将您的孩子活动的DrawerLayout
附加到儿童活动的onCreate()
上的字段:
super.mDrawerLayout = findViewById(R.id.drawer_layout)
您也可以对其他@Override
方法执行此操作,例如onOptionsItemSelected()
。
基于BaseActivity
班级的示例:
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDrawerLayout = findViewById(R.id.drawer_layout);
}
}
另外,请设置BaseAcitivity
摘要以避免“添加到清单警告”:
public abstract class BaseActivity extends AppCompatActivity
2)至于你的第二个问题,我会在你的BaseActivity
中说你可以有一个名为getIntent()
的公共方法,它会返回一个公共{{1}对象。然后,您可以从您的子Activity调用该方法。
你可以在Intent
上使用任何具有共同功能的方法。
3)根据我的个人经验,声明不代表其本身目的的资源值(例如您的BaseActivity
)会适得其反。我宁愿根据代表性用途命名它,例如<dimen name="ten_dp">10dp</dimen>
或其他。
确实在XML资源上包含所有硬编码值(字符串,维度,颜色等)是一种很好的做法,您只需要给它们提供重要的名称(将它们视为变量名称)。
修改强>
4)将该方法添加到<dimen name="activity_margin">10dp</dimen>
并将BaseActivity
作为参数传递:
Toolbar
然后,您可以从private void setupToolbar(Toolbar mainToolbar){
setSupportActionBar(mainToolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
}
}
中将其称为:
MainActivity
答案 1 :(得分:0)
1-如何参考抽屉:
如果所有活动的xml中都有抽屉,且ID相同,那么您可以在 BaseActivity 中使用findViewById
。
protected DrawerLayout drawerLayout;
protected void initNavDrawer() {
drawerLayout = findViewById(R.id.drawer);
}
BaseActivity 实际上是当前正在运行的活动,所以findViewById
完全正常,但请确保您在所有活动中都有抽屉,否则您将面临 NullPointerException
2-对于开始活动,在每个活动中,我添加一个静态方法来打开活动
public static void openForEdit(@NonNull Activity context, @NonNull Order order, int requestCode) {
Intent editOrderIntent = new Intent(context, EditOrderActivity.class);
editOrderIntent.putExtra(ORDER_TAG, order);
editOrderIntent.putExtra(EDIT_TAG, true);
context.startActivityForResult(editOrderIntent, requestCode);
}
如果需要,您可以制作多种方法。 然后,只要您想打开活动,只需调用静态方法
即可MyActivity.open(//passing parameters);
3-关于第三点我没有明白你的意思,但只是为了澄清:你需要创建一个名为dimens.xml的新xml文件,然后你声明你的尺寸
4-您可以将此方法放在BaseActivity中,并在BaseActivity中的onCreate中调用它