Java 在片段之间保留数据
我试图使用参数将dataPID从碎片扫描保存到碎片维护 但在my Log.dtag、PID SCAN:+data中,数据始终为空 我的论点有什么问题 这是我的密码 这是我的活动 公共类MainActivity扩展了活动{Java 在片段之间保留数据,java,android,fragment,Java,Android,Fragment,我试图使用参数将dataPID从碎片扫描保存到碎片维护 但在my Log.dtag、PID SCAN:+data中,数据始终为空 我的论点有什么问题 这是我的密码 这是我的活动 公共类MainActivity扩展了活动{ private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawe
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
CustomDrawerAdapter adapter;
SharedPreferences preferences;
String pref;
List<DrawerItem> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = this.getSharedPreferences(Config.PREFERENCES, MODE_PRIVATE);
pref = preferences.getString(Config.SESSION,null);
// Initializing
dataList = new ArrayList<DrawerItem>();
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
// Add Drawer Item to dataList
dataList.add(new DrawerItem("Scanner", R.drawable.ic_action_email));
dataList.add(new DrawerItem("Schedule", R.drawable.ic_action_good));
dataList.add(new DrawerItem("Games", R.drawable.ic_action_gamepad));
dataList.add(new DrawerItem("Logout", R.drawable.ic_action_about));
adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
dataList);
mDrawerList.setAdapter(adapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
SelectItem(0);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void SelectItem(int possition) {
Fragment fragment = null;
Bundle args = new Bundle();
switch (possition) {
case 0:
fragment = new FragmentScan();
break;
case 1:
fragment = new FragmentSchedule();
break;
case 2:
fragment = new FragmentThree();
args.putString(FragmentThree.ITEM_NAME, dataList.get(possition)
.getItemName());
args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition)
.getImgResID());
break;
case 3:
logout();
Intent in = new Intent(this, LoginActivity.class);
startActivity(in);
finish();
return;
default:
break;
}
fragment.setArguments(args);
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, fragment)
.commit();
mDrawerList.setItemChecked(possition, true);
setTitle(dataList.get(possition).getItemName());
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return false;
}
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
SelectItem(position);
}
}
//In the same activity you’ll need the following to retrieve the results:
private void logout(){
//TODO delete cookie from db
SharedPreferences.Editor editor = preferences.edit();
editor.remove(Config.SESSION);
editor.remove(Config.USERNAME);
editor.commit();
}
我希望有人能帮我解决这个问题,
之前谢谢。我认为它应该不为null,也许您只是没有正确检索该值 在日志代码中,您使用了:
Log.d("tag", "PID SCAN: " + data);
但实际上,您使用以下方式存储pid:
data.putString("pid", mPid);
也就是说,您应该使用键pid从包中获取值,如:
Log.d("tag", "PID SCAN: " + data.getString("pid"));
编辑:
如果您试图获取的是进程ID,请查看android.os.process.myPid
如果pid是您自己的预定义变量,包含其他内容,
然后,您需要在创建片段时传递它,如下所示:
fragment = new FragmentScan();
args.putString("pid", YOUR_TV_PID_VALUE);
在FragmentScan的另一端,您可以使用getArguments来获取Bundle,然后使用getStringpid
更新:
在阅读了更多的代码之后,您的循环似乎有点混乱。
但是一个快速的建议是:为什么不像下面这样尝试呢
data.putString("pid", tvPid.getText());
在您的原始代码中,您在savedInstanceState中的pid应该在您执行单击扫描后存在,完成/取消扫描。但是我认为您的代码流有点混乱。
读取调用onSaveInstanceState以在终止活动之前从活动中检索每个实例的状态。
=>这意味着,在您打开scanBtn执行的另一个意图之前,将调用onSaveInstanceState并存储tvPid的空值。当主意图恢复时,它将获得包含pid空字符串的捆绑包。但它应该是,而不是null。是的,我同意。无论如何,我的答案似乎没有帮助。我删除了它。我已将日志d更改为like data.putStringpid,mPid;但我有相同的响应..nullyes,我看到了,并且您尝试过Log.dtag,PID SCAN:+data.getStringpid;?如果它仍然存在,那么您应该显示另一个调用它的代码段FragmentScan@YohanesKhosiawan许先汉 我也有同样的反应
data.putString("pid", tvPid.getText());