有人可以解释一下 Java Android Studio 2022.3.1.9 中“Activity/AppCompatActivity”的原理吗?
我正在尝试“android.widget.GridView”。每个单元格都包含一个整数,例如1、2 或 3。如果有人单击 GridView 的单元格,我将使用相应的“gridview.setOnItemClickListener”来查看新活动。创建事件和相应的新活动的标准方法是:
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Intent intent = new Intent(getApplicationContext(), DisplayMessageActivity.class);
String message = String.valueOf(position); //
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_CONTEXT, getApplicationContext().toString());
startActivity(intent);
}
});
不幸的是,我不喜欢 lambda,所以我将代码扩展/重构为这种形式:
class ImplementingMyOnItemClickListener extends AppCompatActivity implements AdapterView.OnItemClickListener {
android.content.Context context = null;
Class<?> cls = DisplayMessageActivity.class; // SingleViewActivity.class - see below
public Intent sent_intent = null;
@Override
public void onItemClick(AdapterView<?> t_parent, View t_view, int t_position, long t_id) {
Intent i = new Intent(this.context, cls); //
i.putExtra("id", String.valueOf(t_position));
sent_intent = i;
this.context.startActivity(i); -- THIS IS WORKING OK --- and why ?
this.startActivity(i); -- THIS DOES NOT WORK --- and why ?
}//
}//
和“class ImplementingMyOnItemClickListener:protected void onCreate(Bundle savedInstanceState)”是从“public class
MainActivity extends AppCompatActivity" class using this code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
ImplementingMyOnItemClickListener oicl = new ImplementingMyOnItemClickListener();
oicl.context = this; //
gridview.setOnItemClickListener(oicl);
}// protected void onCreate
我的问题是:在“类 ImplementingMyOnItemClickListener”中,我使用“this.context.startActivity(i);”调用新活动并且“上下文”变量是从“public class MainActivity extends AppCompatActivity: protected void onCreate”方法传递的。为什么不能使用“this.startActivity(i);”而不是“this.context.startActivity(i);” ???我认为上下文必须是本地的而不是父级的。
“公共类 SingleViewActivity”是这样的:
public class SingleViewActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_view);
// Get intent data
Intent i = getIntent();
// Selected image id
int position = i.getExtras().getInt("id");
ImageAdapter imageAdapter = new ImageAdapter(this);
ImageView imageView = (ImageView) findViewById(R.id.SingleView);
imageView.setImageResource(imageAdapter.mThumbIds[position]);
}
}
如果有人需要,这里有AndroidStudio Giraffe的完整源代码:
这是一面镜子:
https://drive.google.com/file/d/1AaSqKYc0SQgyV4zrR3f6t-q4qD8a3w7i/view?usp=sharing
我不明白为什么“this.startActivity(i);”不起作用。
this.context
指的是Activity
的上下文。它是本地的。 this.context.getApplicationContext()
指的是Application Context
。它不是本地的。
this.context.startActivity()
启动一个 Activity
,它与调用 startActivity()
的活动具有相同的应用程序上下文。
比如
Activity1
调用this.context.startActivity(Activity2.class)
,那么就得到了Activity1
的应用上下文。然后,如果Activity2
与Activity1
具有相同的应用程序上下文,则启动Activity2
。