解决Android中第二个FloatingActionButton失效的问题

在Android应用开发中,有时会遇到添加了多个FloatingActionButton (FAB),但其中一个或多个无法正常工作,导致应用崩溃的问题。本文将针对这一问题,提供详细的分析和解决方案。问题的核心通常在于Inte

nt上下文的使用不当。

当你在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和数据库操作中,也使用了正确的上下文。