2016-11-29 76 views
0

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

现在,当我尝试使用意图我有错误:

Non-static method cannot be referenced by a static context.

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

我尝试以下之前在这里问:

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

检查这个例子,它肯定会帮助https://github.com/shanwu/SimpleListView示例 – shanwu

+0

将上下文传递给适配器。 1.你应该保持你的内部类是静态的,这是防止内存泄漏的好方法。 – shanwu

回答

2

尝试使用活动的参考。

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

    } 

Ref。 How to open a different activity on recyclerView item onclick

关于

delete the word static from my inner class, but did not solve and the app crashes

你可能更接近与去除static的解决方案。该应用程序实际上建立应用程序崩溃意味着您应该阅读logcat并实施适当的解决方案。

+0

'ActivityOne.this'只有在MessageViewHolderOfFriend类不是静态的时才有效。 – 4castle

+0

这就是为什么我跟进“如果这不起作用”。无论如何,ViewHolder类应该是静态的吗? –

+0

cricket_007的第二个解决方案工作! 1:在静态内部类中:创建一个私有的最终上下文上下文; 2.在静态内部类的构造函数内部,在调用super(v)之后,使用上下文:contex = v.getContext(); 3.内部v.setOnClickListener(...){意图intent =新的意图(上下文,NewActivityToRun.class);//打开 – Gustavomcls

1

您需要使用的背景下开始SecondActivity,当您使用context.startActivity(意向) ,你应该添加 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 之前startActivity(意向)

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

相关问题