Java 如何在内部静态类中使用Intent启动活动?
在我的Java 如何在内部静态类中使用Intent启动活动?,java,android,android-intent,static,Java,Android,Android Intent,Static,在我的活动类中有一个静态和内部类。我需要使用Intent(context,nameofnewactivity.class)调用活动,因为我试图在单击RecyclerView.ViewHolder中的项目时调用Intent。我必须重写onClick以获取使用getLayoutPosition()单击的项目的位置(此getLayoutPosition()工作正常) 现在,当我尝试使用Intent时,出现了错误: 静态上下文无法引用非静态方法 我读了Stackoverflow的另一个链接。在这种情况下
活动类
中有一个静态和内部类。我需要使用Intent(context,nameofnewactivity.class)
调用活动,因为我试图在单击RecyclerView.ViewHolder
中的项目时调用Intent
。我必须重写onClick
以获取使用getLayoutPosition()
单击的项目的位置(此getLayoutPosition()工作正常)
现在,当我尝试使用Intent时,出现了错误:
静态上下文无法引用非静态方法
我读了Stackoverflow的另一个链接。在这种情况下,如何在静态上下文和内部类中调用Intent,即如何在内部类中获取上下文,以及如何解决**基本**错误以不从静态类调用非静态类
在这里提问之前,我尝试了以下方法:
public class ActivityOne extends AppCompatActivity implements
GoogleApiClient.OnConnectionFailedListener {
public static class MessageViewHolderOfFriend extends RecyclerView.ViewHolder { public MessageViewHolderOfFriend(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
;
Intent intent = new Intent(v.getContext(),NewActivityToRun.class);
startActivity(intent);//Error in this Line//
}
});
}
}
public class ActivityOne extends AppCompatActivity implements
GoogleApiClient.OnConnectionFailedListener {
public static class MessageViewHolderOfFriend extends RecyclerView.ViewHolder { public MessageViewHolderOfFriend(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
;
Intent intent = new Intent(v.getContext(),NewActivityToRun.class);
startActivity(intent);//Error in this Line//
}
});
}
}
尝试使用活动的引用
ActivityOne.this.startActivity(intent);
如果这不起作用,那么要知道startActivity
是任何上下文的一种方法
class MessageViewHolderOfFriend extends RecyclerView.ViewHolder {
private final Context context;
public MessageViewHolderOfFriend(View v) {
super(v);
context = v.getContext();
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context,NewActivityToRun.class);
context.startActivity(intent);
}
});
}
参考文献
关于
从我的内部类中删除单词static,但没有解决问题,应用程序崩溃
通过删除
static
,您可能更接近解决方案。这个应用程序实际上是构建的。应用程序崩溃意味着您应该阅读日志并实施正确的解决方案 尝试使用活动的引用
ActivityOne.this.startActivity(intent);
如果这不起作用,那么要知道startActivity
是任何上下文的一种方法
class MessageViewHolderOfFriend extends RecyclerView.ViewHolder {
private final Context context;
public MessageViewHolderOfFriend(View v) {
super(v);
context = v.getContext();
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context,NewActivityToRun.class);
context.startActivity(intent);
}
});
}
参考文献
关于
从我的内部类中删除单词static,但没有解决问题,应用程序崩溃
通过删除
static
,您可能更接近解决方案。这个应用程序实际上是构建的。应用程序崩溃意味着您应该阅读日志并实施正确的解决方案 在使用Context.startActivity(intent)时,您需要使用上下文来启动SecondActivity
你应该加上
intent.addFlags(intent.FLAG\u活动\u新任务)
星前触觉(意图)
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// method 1:
MyInnerClass innerClass = new MyInnerClass();
innerClass.firstLauncher(MainActivity.this);
// method 2:
// MyInnerClass.secondLauncher(MainActivity.this);
}
});
}
static class MyInnerClass {
/**
* member method
*/
private void firstLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 1th");
context.startActivity(intent);
}
/**
* static method
*/
private static void secondLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 2th");
context.startActivity(intent);
}
}
}
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
TextView textView = (TextView) findViewById(R.id.tv_msg);
String msg = getIntent().getStringExtra("flag_activity");
textView.setText(msg);
}
}
SecondActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// method 1:
MyInnerClass innerClass = new MyInnerClass();
innerClass.firstLauncher(MainActivity.this);
// method 2:
// MyInnerClass.secondLauncher(MainActivity.this);
}
});
}
static class MyInnerClass {
/**
* member method
*/
private void firstLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 1th");
context.startActivity(intent);
}
/**
* static method
*/
private static void secondLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 2th");
context.startActivity(intent);
}
}
}
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
TextView textView = (TextView) findViewById(R.id.tv_msg);
String msg = getIntent().getStringExtra("flag_activity");
textView.setText(msg);
}
}
所有的实现都在ContextImpl.java文件中。使用Context.startActivity(intent)时,需要使用上下文来启动SecondActivity 你应该加上 intent.addFlags(intent.FLAG\u活动\u新任务) 星前触觉(意图) MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// method 1:
MyInnerClass innerClass = new MyInnerClass();
innerClass.firstLauncher(MainActivity.this);
// method 2:
// MyInnerClass.secondLauncher(MainActivity.this);
}
});
}
static class MyInnerClass {
/**
* member method
*/
private void firstLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 1th");
context.startActivity(intent);
}
/**
* static method
*/
private static void secondLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 2th");
context.startActivity(intent);
}
}
}
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
TextView textView = (TextView) findViewById(R.id.tv_msg);
String msg = getIntent().getStringExtra("flag_activity");
textView.setText(msg);
}
}
SecondActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// method 1:
MyInnerClass innerClass = new MyInnerClass();
innerClass.firstLauncher(MainActivity.this);
// method 2:
// MyInnerClass.secondLauncher(MainActivity.this);
}
});
}
static class MyInnerClass {
/**
* member method
*/
private void firstLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 1th");
context.startActivity(intent);
}
/**
* static method
*/
private static void secondLauncher(Context context) {
Intent intent = new Intent(context, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("flag_activity", "I'm 2th");
context.startActivity(intent);
}
}
}
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
TextView textView = (TextView) findViewById(R.id.tv_msg);
String msg = getIntent().getStringExtra("flag_activity");
textView.setText(msg);
}
}
所有的实现都在ContextImpl.java文件中。
ActivityOne。只有当MessageViewHolderOfFriend
类不是静态的时,这个
才会起作用。这就是为什么我接着说“如果不起作用”。ViewHolder类应该是静态的吗?cricket_007的第二个解决方案成功了!1:在静态内部类中:创建私有的最终上下文;2.在静态内部类的构造函数中,在调用super(v)之后,获取上下文:contex=v.getContext();3.在v.setOnClickListener(…){Intent Intent Intent=newintent(context,NewActivityToRun.class);//打开ActivityOne。只有当MessageViewHolderOfFriend
类不是静态的时,这个才会起作用。这就是为什么我接着说“如果不起作用”。ViewHolder类无论如何都应该是静态的吗?cricket_007的第二个解决方案奏效了!1.在静态内部类中:创建一个私有的最终上下文上下文;2.在静态内部类的构造函数中,在调用super(v)后,获取上下文:contex=v.getContext();3.在v.setOnClickListener(…){Intent Intent=newintent(上下文,NewActivityToRun.class);//若要打开检查此示例,它肯定会帮助将上下文传递给适配器。1.您应该保持内部类的静态,这是防止内存泄漏的好方法。检查此示例,它肯定会帮助将上下文传递给适配器。1.您应该保持内部类的静态,这是防止内存泄漏的好方法。