2017-12-23 21 views
2

異なるアクティビティに属するボタンのonClickListenerを設定するにはどうすればよいですか? 私はsharedPreferencesを使用しており、別のアクティビティでログアウトボタンを作成したいとします。起動時に開くアクティビティには、ログアウトボタンはありません。だからこそ私はsharedPreferencesのコードをすべてプロファイル活動に持っていません。別のアクティビティクラスからonclicklistenerを設定するにはどうすればよいですか?

HomeActivityクラス

//UserSessionManager class 
UserSessionManager session; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    //start new activity when fab is clicked 
    final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(getApplicationContext(), Profile.class); 
      startActivity(intent); 
     } 
    }); 

    session = new UserSessionManager(getApplicationContext()); 

    //check if user is logged in 
    //if the user is not logged in 
    if (session.checkLogin()) { 
     finish(); 
    } 

    HashMap<String, String> user = session.getUserDetails(); 

    //get variables 
    String username = user.get(UserSessionManager.KEY_USERNAME); 
    String age = user.get(UserSessionManager.KEY_AGE); 
    String firstName = user.get(UserSessionManager.KEY_FIRSTNAME); 


    EditText etUsername = (EditText) findViewById(R.id.etEmail); 
    EditText etAge = (EditText) findViewById(R.id.etAge); 

私は、ログアウトボタンがプロフィール活動になりたいです。私は、パラメータとしてHomeActivityクラスからセッション変数を受け取り、送信セッションのメソッドを作成し、さまざまなことをやった後

Button bLogOut; 
UserSessionManager sessionManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_profile); 
} 
public void sendSession(final UserSessionManager userSession) { 
    bLogOut = (Button)findViewById(R.id.bLogOut); 

    bLogOut.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      userSession.logoutUser(); 
     } 
    }); 
} 

:ここ

プロファイルクラスです。私はまだnullpointerexceptionを持っています。

答えて

1

を、

をこのようなあなたのHomeActivity.classのレシーバを作成します。
public BroadcastReceiver logoutReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      /Do what ever you want. 
     } 
    }; 

今すぐちょうど私が正常にログインとログアウトは、このタイプを行うことですどのように処理するか、この

sendBroadcast(new Intent("com.saim.logoutReceiver")); 
0

使用onActivityResultログアウトボタンアクション処理する:

HomeActivityクラス:

/* keep this static final variables on a separate file */ 
public static final int LOGOUT_ACTION = 1; 
public static final int REQUEST_LOGOUT = 2; 
public static final int RESULT_LOGOUT = 3; 
/* ============== */ 


//start new activity when fab is clicked 
final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(this, ProfileActivity.class); 
     startActivityForResult(intent, IntentUtil.REQUEST_LOGOUT); 
    } 
}); 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == REQUEST_LOGOUT && resultCode == RESULT_LOGOUT) { 
     //Handle logout here 
    } 

ProfileActivityクラス:

bLogOut.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(); 
     setResult(RESULT_LOGOUT, intent); 
    } 
}); 
0

のような任意のactivtyからブロードキャストを送信

あなたHomeActvity.classに

@Override 
    protected void onStart() { 
     super.onStart(); 
     IntentFilter intentFilter = new IntentFilter("com.saim.logoutReceiver"); 
     registerReceiver(logoutReceiver, intentFilter); 

    } 

    @Override 
    protected void onDestroy() { 
     try { 
      super.onDestroy(); 
      unregisterReceiver(logoutReceiver); 
     } catch (IllegalArgumentException i) { 

     } 
    } 
をあなたのレシーバを登録し、登録解除パターン。

ユーザーが起動時にログインしていることを確認してから、認証アクティビティを起動します。ユーザーがログインしていない場合は、ユーザーがログインするまでログインアクティビティを実行します。メインアクティビティ - (ニーズログイン) - >認証アクティビティ - >(RESULT_OKまたはRESULT_CANCELLED) - > RESULT_CANCELLEDの場合、MainActivityはAuthenticationActivityを再起動します。 RESULT_OKの場合は、引き続きユーザーがあなたのアプリを使用できるようにします。

onCreate()では、ユーザーがログインしているかどうかを確認するためにセッションコードを保持することは悪い考えではありません。あなたが別のアクティビティからMainActivityに戻って、ユーザがログインしていないことを発見すると、それらをあなたの認証アクティビティに投げ戻すことができます。

これについて注意するべきことは、ログインアクティビティのonBackPressed()をオーバーライドして、偶然MainActivityに戻らないようにすることです。

サンプル:

MainActivity

public class MainActivity extends AppCompatActivity { 

    private boolean isAuthenticated = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (/* User not logged in */) { 
      Intent intent = new Intent(MainActivity.this, AuthenticationActivity.class); 
      startActivityForResult(intent, AUTHENTICATION_REQ_CODE); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == AUTHENTICATION_REQ_CODE) { 
      if (resultCode == RESULT_CANCELED) { 
       Intent intent = new Intent(MainActivity.this, AuthenticationActivity.class); 
       startActivityForResult(intent, AUTHENTICATION_REQ_CODE); 

       // User has cancelled login, redirect back to auth 
      } 
      else if (resultCode == RESULT_OK) { 
       // User has logged in 
       isAuthenticated = true; 
      } 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

AuthenticationActivity

public class AuthenticationActivity extends AppCompatActivity { 

    Button loginButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Do all your checks and if it all goes well, set result to RESULT_OK and finish to 
       // MainActivity 
       setResult(RESULT_OK); 
       finish(); 
      } 
     }); 
    } 

    @Override 
    public void onBackPressed() { 
     setResult(RESULT_CANCELED); 
     finish(); 

     super.onBackPressed(); 
    } 
} 
関連する問題