【问题标题】:How start an activity using Intent inside a inner static class?如何在内部静态类中使用 Intent 启动活动?
【发布时间】:2016-11-29 03:04:56
【问题描述】:

我的 Activityclass 中有一个 staticinner 类。我需要使用Intent(context,nameOfTheNewActivity.class) 调用活动,因为当单击RecyclerView.ViewHolder 中的项目时,我试图调用Intent。我必须覆盖onClick 才能使用getLayoutPosition() 单击项目的位置(此 getLayoutPosition() 工作正常)。

现在当我尝试使用 Intent 时出现错误:

静态上下文不能引用非静态方法。

我从 Stackoverflow 阅读了另一个链接,例如 this。在这种静态上下文和内部类内部的情况下,如何调用 Intent,即,如何获取内部类内部的上下文,以及如何解决 **fundamental ** 错误以不调用非静态静态类中的类?

在这里提问之前我尝试了以下方法:

  1. 使用 v.context 从视图中获取上下文,但我继续解决问题 - 仍然从静态上下文调用非静态方法。

  2. "Static" startActivity(Intent) method?

  3. 从我的内部类中删除静态一词,但没有解决,应用程序崩溃。

我的代码:

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//
            }
        });
    }
}

【问题讨论】:

  • 检查这个例子,它肯定会帮助github.com/shanwu/SimpleListViewExample
  • 将上下文传递给适配器。 1. 你应该保持你的内部类是静态的,这是防止内存泄漏的好方法。

标签: java android android-intent static


【解决方案1】:

尝试使用 Activity 的引用。

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);
            }
        });

    }

参考。 How to open a different activity on recyclerView item onclick

关于

从我的内部类中删除静态一词,但没有解决,应用程序崩溃

您可能更接近于删除 static 的解决方案。该应用程序实际构建。应用程序崩溃意味着您应该阅读 logcat 并实施正确的解决方案。

【讨论】:

  • ActivityOne.this 仅在 MessageViewHolderOfFriend 类不是静态的情况下才有效。
  • 这就是我跟进“如果这不起作用”的原因。 ViewHolder 类是否应该是静态的?
  • cricket_007 的第二个解决方案奏效了! 1:在静态内部类内部:创建一个私有的final Context上下文; 2.在静态内部类的构造函数中,调用super(v)后,取上下文:contex=v.getContext(); 3. inside v.setOnClickListener(...){ Intent intent = new Intent(context,NewActivityToRun.class);//打开
【解决方案2】:

在使用context.startActivity(intent)时,需要使用Context来启动SecondActivity 你应该添加 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 在 startActivity(intent) 之前

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);
    }

}
}

SecondActivity.java:

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 文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多