Java 如何在启动另一个活动后保留变量
当我尝试访问已在以下类中初始化的列表锦标赛时:Java 如何在启动另一个活动后保留变量,java,android,static,Java,Android,Static,当我尝试访问已在以下类中初始化的列表锦标赛时: public class AdminControl extends AppCompatActivity { Firebase ref; FloatingActionButton fab; public static List <Tournament> tournaments; ListView list; Tournament [] temp; @Override protect
public class AdminControl extends AppCompatActivity {
Firebase ref;
FloatingActionButton fab;
public static List <Tournament> tournaments;
ListView list;
Tournament [] temp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_control);
Toolbar b = (Toolbar) findViewById(R.id.toolbar);
b.setTitle("Tournaments");
setSupportActionBar(b);
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
createNewTournament(v);
}
});
AdminLogin.firebase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
tournaments = (ArrayList) dataSnapshot.getValue();
Object [] objArr = tournaments.toArray();
temp = new Tournament[objArr.length];
for (int i = 0; i < objArr.length; i++){
temp[i] = (Tournament) objArr[i];
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
if (tournaments == null){
tournaments = new ArrayList<Tournament>();
}
list = (ListView) findViewById(R.id.listView);
ArrayAdapter<Tournament> tempAdapter = new ArrayAdapter<Tournament>(
this, android.R.layout.simple_list_item_1, temp);
list.setAdapter(tempAdapter);
}
public void createNewTournament(View v) {
Intent newIntent = new Intent(this, TournamentCreator.class);
startActivity(newIntent);
}
}
也许最好使用另一个singleton类来管理锦标赛列表。最好不要混合使用视图(活动)和模型(比赛)类,因为Android中的视图类(如活动和片段)会经历几个生命周期事件,如onCreate()等。你难道不可以使用onActivityResult()返回创建的比赛吗?我没有完美的答案,但我可以说,从另一个活动引用静态变量没有什么错。如果访问该变量时出现问题,则会出现其他错误,但无论出于何种原因,该变量实际上是空的。所以您可以尝试将“Log.i(TAG,“tournaments的值为”+tournaments.toString());”放在createNewTournament方法中,以便在启动新活动之前查看该变量中的实际内容。。。根据@BooberBunz所说的,如果你要为你的
列表设置一些硬编码值,你可以在不同的活动中访问它们。尝试确保没有任何东西意外地将您的列表设置为null
,如果这样做有效,那么您需要找出onDataChange
无法正常工作的原因。看起来锦标赛被设置为null:)也许使用另一个单例类来管理锦标赛列表更好。最好不要混合使用视图(活动)和模型(比赛)类,因为Android中的视图类(如活动和片段)会经历几个生命周期事件,如onCreate()等。你难道不可以使用onActivityResult()返回创建的比赛吗?我没有完美的答案,但我可以说,从另一个活动引用静态变量没有什么错。如果访问该变量时出现问题,则会出现其他错误,但无论出于何种原因,该变量实际上是空的。所以您可以尝试将“Log.i(TAG,“tournaments的值为”+tournaments.toString());”放在createNewTournament方法中,以便在启动新活动之前查看该变量中的实际内容。。。根据@BooberBunz所说的,如果你要为你的列表设置一些硬编码值,你可以在不同的活动中访问它们。尝试这样做以确保没有任何东西意外地将列表设置为null
,如果这样做有效,那么您需要找出onDataChange
无法正常工作的原因。看起来锦标赛设置为null:)
public class TournamentCreator extends AppCompatActivity {
private Button b;
@Override
protected void onCreate(Bundle savedInstanceState) {
Object a = AdminControl.tournaments;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tournament_creator);
b = (Button) findViewById(R.id.button3);
b.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
beginTournament(v);
}
});
}
public void beginTournament(View v) {
EditText text = (EditText) findViewById(R.id.editText);
Tournament newTourn = new Tournament(text.getText().toString());
AdminControl.tournaments.add(newTourn);
Firebase userRef = AdminLogin.firebase.child("users").child(AdminLogin.firebase.getAuth().getUid());
userRef.setValue(AdminControl.tournaments);
finish();
}
}