[我试图制作自己的Tic Tac Toe game
,所以我创建了两个活动(MainActivity, GameActivity
),第二个活动包含一个Fragment
,显示gridView
。为了存储乐谱和演奏者的名字,我创建了一个Player
类,每个播放器都有一个唯一值ID
,该值在构造播放器对象时生成。
import android.app.*;
import android.os.*;
import android.widget.*;
import android.view.View.*;
import android.view.*;
import android.content.*;
public class MainActivity extends Activity implements OnClickListener
{
@Override
public void onClick(View p1)
{
// TODO: Implement this method
Intent i=new Intent(MainActivity.this,GameActivity.class);
startActivity(i);
}
Button start;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start=(Button)findViewById(R.id.start);
start.setOnClickListener(this);
}
}
GameActivity
public class GameActivity extends Activity
{
Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
getActionBar().hide();
loadFragment(fragment,savedInstanceState);
}
public void loadFragment(Fragment fragment,Bundle bundle){
FragmentManager manager=getFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
fragment=new gameFragment();
transaction.replace(R.id.grid_container,fragment,"this");
transaction.commit();
}
@Override
protected void onDestroy()
{
// TODO: Implement this method
super.onDestroy();
}
}
GameFragment
public class gameFragment extends Fragment
{
GameGridAdapter adapter;
GridView gv;
boolean isGameOver=false;
Player playerOne,playerTwo,currentPlayer;
@Override
public void onAttach(Context context)
{
// TODO: Implement this method
init();
super.onAttach(context);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// TODO: Implement this method
View view=inflater.inflate(R.layout.fragment_layout_grid,container,false);
gv=(GridView)view.findViewById(R.id.grid);
adapter=new GameGridAdapter(getActivity());
gv.setAdapter(adapter);
Toast.makeText(getContext(),"player id "+ playerOne.getId(),Toast.LENGTH_SHORT).show();
gv.setOnItemClickListener(new AdapterViewAnimator.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> p1, View view, int pos, long viewId)
{
// TODO: Implement this method
return view;
}
public void init(){
playerOne=new Player();
playerTwo=new Player();
}
}
我的问题是,每当我按下gameFragment中的返回按钮并第二次返回它时,Player对象中的id就会增加,就像我创建一个新对象一样。
对于您的特定情况-建议您在Application
类中创建并存储您的播放器。 https://developer.android.com/reference/android/app/Application。
您将必须创建android.app.Application的实现
class MyApplication extends Application {
public Player player1;
public Player player2;
@Override
public void onCreate() {
super.onCreate();
player1 = new Player();
player2 = new Player();
}
}
不要忘记在AndroidManifest.xml
中提及它>
<application android:name=".MyApplication"> </application>
然后通过获取应用程序上下文来访问播放器对象:
Player player1 = ((MyApplication) getActivity().getApplicationContext()).player1; Player player2 = ((MyApplication) getActivity().getApplicationContext()).player2;
[我不得不警告您,这种方法很少被推荐,并且要向您指出一些依赖注入框架,例如Dagger
或Koin (for Kotlin)
。此外,如果您的应用程序被用户或系统破坏,则这些对象将消失。