2016-11-29 75 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文件中。

相關問題