如何在内部静态类中使用Intent启动一个活动?

时间:2016-11-29 03:04:56

标签: java android android-intent static

我的Activityclass中有一个静态内部类。我需要使用Intent(context,nameOfTheNewActivity.class)来调用活动,因为我在点击Intent中的某个项目时尝试调用RecyclerView.ViewHolder。我必须覆盖onClick才能使用getLayoutPosition()点击该项目的位置(此getLayoutPosition()工作正常)。

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

  

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

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

我在尝试之前尝试了以下内容:

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

  2. "Static" startActivity(Intent) method?

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

  4. 我的代码:

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

2 个答案:

答案 0 :(得分:3)

尝试使用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一词,但没有解决,应用程序崩溃

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

答案 1 :(得分:1)

当您使用 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文件中。