
在Android应用开发中,有时会遇到添加了多个FloatingActionButton (FAB),但其中一个或多个无法正常工作,导致应用崩溃的问题。本文将针对这一问题,提供详细的分析和解决方案。问题的核心通常在于Intent上下文的使用不当。
当你在FoodActivity中使用getApplicationContext()作为Intent的上下文时,可能会导致问题。getApplicationContext()返回的是整个应用程序的上下文,而启动Activity需要的是当前Activity的上下文。
以下是修改后的代码,将getApplicationContext()替换为this,即当前FoodActivity的实例:
public class FoodActivity extends AppCompatActivity {
FloatingActionButton mCreateRem;
RecyclerView mRecyclerview;
ArrayList dataholder = new ArrayList();
myAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food);
mRecyclerview = (RecyclerView) findViewById(R.id.recyclerView_food);
mRecyclerview.setLayoutManager(new LinearLayoutManager(this)); // 使用 this
mCreateRem = (FloatingActionButton) findViewById(R.id.create_reminder);
mCreateRem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(FoodActivity.this, FoodAddReminder.class); // 使用 FoodActivity.this 或者 this
startActivity(intent);
}
});
Cursor cursor = new dbManager(this).readallreminders(); // 使用 this
while (cursor.moveToNext()) {
Model model = new Model (cursor.getString(1), cursor.getString(2), cursor.getString(3));
dataholder.add(model);
}
adapter = new myAdapter(dataholder);
mRecyclerview.setAdapter(adapter);
}
@Override
public void onBackPressed() {
finish();
super.onBackPressed();
}
} 解释:
- this 关键字: this 关键字在FoodActivity的上下文中指的是FoodActivity的实例。使用this作为Intent的上下文,可以确保系统知道从哪个Activity启动新的Activity。
- FoodActivity.this: 显式地使用FoodActivity.this也能达到同样的效果,明确指定了上下文为FoodActivity的实例。
注意事项:
- 确保在RecyclerView的LayoutManager初始化时也使用正确的上下文。
- 在访问数据库时,也需要使用正确的上下文。
总结:
当遇到FloatingActionButton点击事件无法正常工作,并导致应用崩溃的问题时,首先检查Intent的上下文是否正确。通常情况下,将getApplicationContext()替换为this或YourActivityName.this可以解决问题。同时,确保在其他需要上下文的地方,如RecyclerView的LayoutManager和数据库操作中,也使用了正确的上下文。










