我对android编程很新,并尝试保存一个(或多个)活动的数据,以便以后在不同的活动中使用它们。我的计划是使用sharedPreferences来做到这一点。我创建了所有变量等,但是当我想从活动D_Maschine中的活动C_Produktspezifikation调用保存的数据时,我得到一个NullPointerException。 片段或其他什么问题?我在网上搜索并尝试了很多不同的东西,但到目前为止还没有任何工作。 我希望有人可以帮助我并解释我的错误。 提前谢谢
以下是数据的第一个活动:
package com.robomillup.wirtschaftlichkeit;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.robomillup.wirtschaftlichkeit.DB_Werkstueck.WST_bearbeiten;
import com.robomillup.wirtschaftlichkeit.DB_Werkstueck.WstDBHandler;
import java.util.ArrayList;
public class C_Produktspezifikation extends AppCompatActivity {
public static final String SHARED_PREFS = "sp_Produktspezifikation"; //Name der shared Prefs für diese Seite
public static final String WST_NAME = "Wst_Name"; //shared Prefs für Werkstückname
public static final String SCHNITTWEG = "Schnittweg"; //shared Prefs für Schnittweg
public static final String LOSGROESSE = "Losgroeße"; //shared Prefs für Losgröße
public static final String STUECKZAHL = "Stueckzahl"; //shared Prefs für Stückzahl
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_produktspezifikation);
//region BUTTON DEKLARATION
Button neuesWST = (Button) findViewById(R.id.btn_Neu_WST);
neuesWST.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(C_Produktspezifikation.this,WST_bearbeiten.class));
}
});
Button Weiter = (Button) findViewById(R.id.btn_Produktspezifikation_weiter);
Weiter.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
saveData_Produktspezifikation();
startActivity(new Intent(C_Produktspezifikation.this,D_Maschine.class));
}
});
Button Abbrechen = (Button) findViewById(R.id.btn_Produktspezifikation_zurück);
Abbrechen.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(C_Produktspezifikation.this,B_Auswahl.class));
}
});
//endregion
SpinnerDatenEinfuegen();
}
@Override
protected void onResume() {
super.onResume();
SpinnerDatenEinfuegen();
}
//Spinner mit den Daten aus der Werkstückdatenbank füllen
private void SpinnerDatenEinfuegen() {
// Elemente zum Spinner hinzufügen
WstDBHandler dbHandler = new WstDBHandler(this, null, null, 1);
SQLiteDatabase sqLiteDatabase = dbHandler.getReadableDatabase();
Cursor cursor = dbHandler.getAllRows(sqLiteDatabase);
if (cursor.moveToFirst()) {
Spinner spinner;
String wstname, schnittweg;
final ArrayList<String> wstliste = new ArrayList<String>();
final ArrayList<String> schnittwegliste = new ArrayList<String>();
do {
//Werkstücke aus Datenbank lesen
wstname = cursor.getString(1);
schnittweg = cursor.getString(2);
wstliste.add(wstname);
schnittwegliste.add(schnittweg);
} while (cursor.moveToNext());
// dataAdapter zu Spinner hinzufügen
spinner = (Spinner) findViewById(R.id.spn_wst);
ArrayAdapter<String> spinner_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, wstliste);
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinner_adapter);
//Auswahl von Spinner Daten füllen entsprechende Felder aus
Spinner spinner1 = (Spinner) findViewById(R.id.spn_wst);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
wstliste.get(position);
TextView gew_werkstueck, gew_schnittweg;
gew_werkstueck = (TextView) findViewById(R.id.tv_WST);
gew_schnittweg = (TextView) findViewById(R.id.tv_Schnittweg_Eintrag);
gew_werkstueck.setText(wstliste.get(position).toString());
gew_schnittweg.setText(schnittwegliste.get(position).toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
}
//Daten an die Shared Prefs übergeben
public void saveData_Produktspezifikation(){
//Deklaration der Variablen, die an Shared Prefs übergeben werden sollen
TextView WstName = (TextView) findViewById(R.id.tv_WST);
TextView Schnittweg = (TextView) findViewById(R.id.tv_Schnittweg_Eintrag);
EditText Stueckzahl = (EditText) findViewById(R.id.et_Stuekzahl_Eintrag);
EditText Losgroeße = (EditText) findViewById(R.id.et_losgroeße);
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE); //Mode Private, damit keine andere App unsere Shared Preferences ändern kann
SharedPreferences.Editor editor = sharedPreferences.edit();
//Hier werden im Editor der Shared Prefs nun die eigentlichen Daten übergeben
editor.putString(WST_NAME, WstName.getText().toString());
editor.putString(SCHNITTWEG, Schnittweg.getText().toString());
editor.putString(STUECKZAHL, Stueckzahl.getText().toString());
editor.putString(LOSGROESSE, Losgroeße.getText().toString());
editor.apply();
}
}
这是第二个应该加载数据并将其插入到一些textview中的活动:
package com.robomillup.wirtschaftlichkeit;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.robomillup.wirtschaftlichkeit.DB_Bearbeitungsmaschine.MaschineDBHandler;
import com.robomillup.wirtschaftlichkeit.DB_Bearbeitungsmaschine.Bearbeitungsmaschine_bearbeiten;
import static com.robomillup.wirtschaftlichkeit.C_Produktspezifikation.LOSGROESSE;
import static com.robomillup.wirtschaftlichkeit.C_Produktspezifikation.SCHNITTWEG;
import static com.robomillup.wirtschaftlichkeit.C_Produktspezifikation.SHARED_PREFS;
public class D_Maschine extends AppCompatActivity {
private static String sp_Schnittweg;
private static String sp_Losgroesse;
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maschine);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_maschine);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container_maschine);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs_maschine);
tabLayout.setupWithViewPager(mViewPager);
//region BUTTON DEKLARATION REGION
//Weiter Button
Button Weiter = (Button) findViewById(R.id.btn_maschine_weiter);
Weiter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(D_Maschine.this, E_Werkzeug.class);
startActivity(i);
}
});
//Zurück Button
Button Abbrechen = (Button) findViewById(R.id.btn_maschine_zurück);
Abbrechen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(D_Maschine.this, C_Produktspezifikation.class);
startActivity(i);
}
});
//endregion
loadData();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_varianten, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
// Definitionen, was in den einzelnen Tabs zu sehen ist und passiert
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Definition von Inhalt und so von Fragment 1
if (getArguments().getInt(ARG_SECTION_NUMBER) == 1){
final View rootView = inflater.inflate(R.layout.fragment_maschine_variante_1, container, false);
// Button für neues Werkstück
Button neuesWst = (Button) rootView.findViewById(R.id.btn_v1_Neu_Maschine);
neuesWst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), Bearbeitungsmaschine_bearbeiten.class);
startActivity(i);
}
});
//region SPINNER BEFUELLEN REGION
MaschineDBHandler dbHandler = new MaschineDBHandler(getActivity(), null, null, 2);
SQLiteDatabase sqLiteDatabase = dbHandler.getReadableDatabase();
Cursor cursor = dbHandler.getAllRows(sqLiteDatabase);
if (cursor.moveToFirst()) {
Spinner spinner;
String maschinenname, anschaffungswert, raumbedarf, el_anschlusswert;
final ArrayList<String> maschineliste = new ArrayList<String>();
final ArrayList<String> anschaffungswertliste = new ArrayList<String>();
final ArrayList<String> raumbedarfliste = new ArrayList<String>();
final ArrayList<String> el_anschlusswertliste = new ArrayList<String>();
do {
//Bearbeitungsmaschine aus Datenbank lesen
maschinenname = cursor.getString(1);
anschaffungswert = cursor.getString(2);
raumbedarf = cursor.getString(3);
el_anschlusswert = cursor.getString(4);
maschineliste.add(maschinenname);
anschaffungswertliste.add(anschaffungswert);
raumbedarfliste.add(raumbedarf);
el_anschlusswertliste.add(el_anschlusswert);
} while (cursor.moveToNext());
// dataAdapter zu Spinner hinzufügen
spinner = (Spinner) rootView.findViewById(R.id.sp_v1_Maschine);
ArrayAdapter<String> spinner_adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, maschineliste);
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinner_adapter);
//Auswahl von Spinner Daten füllen entsprechende Felder aus
Spinner spinner1 = (Spinner) rootView.findViewById(R.id.sp_v1_Maschine);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
maschineliste.get(position);
TextView gew_maschine, gew_anschaffungswert, gew_raumbedarf, gew_el_anschlusswert;
gew_maschine = (TextView) rootView.findViewById(R.id.tv_v1_Maschine);
gew_anschaffungswert = (TextView) rootView.findViewById(R.id.et_v1_Werkzeug_Standweg_Eintrag);
gew_raumbedarf = (TextView) rootView.findViewById(R.id.tv_v1_Werkzeug_Schnittweg_Eintrag);
gew_el_anschlusswert = (TextView) rootView.findViewById(R.id.tv_m_v1_el_Anschlusswert_Eintrag);
gew_maschine.setText(maschineliste.get(position).toString());
gew_anschaffungswert.setText(anschaffungswertliste.get(position).toString());
gew_raumbedarf.setText(raumbedarfliste.get(position).toString());
gew_el_anschlusswert.setText(el_anschlusswertliste.get(position).toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
//endregion
return rootView;
}
//Definition von Inhalt und so von Fragment 2
else {
final View rootView = inflater.inflate(R.layout.fragment_maschine_variante_2, container, false);
// Button für neues Werkstück
Button neuesWst = (Button) rootView.findViewById(R.id.btn_v2_Neu_Maschine);
neuesWst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), Bearbeitungsmaschine_bearbeiten.class);
startActivity(i);
}
});
//region SPINNER BEFUELLEN REGION
MaschineDBHandler dbHandler = new MaschineDBHandler(getActivity(), null, null, 2);
SQLiteDatabase sqLiteDatabase = dbHandler.getReadableDatabase();
Cursor cursor = dbHandler.getAllRows(sqLiteDatabase);
if (cursor.moveToFirst()) {
Spinner spinner;
String maschinenname, anschaffungswert, raumbedarf, el_anschlusswert;
final ArrayList<String> maschineliste = new ArrayList<String>();
final ArrayList<String> anschaffungswertliste = new ArrayList<String>();
final ArrayList<String> raumbedarfliste = new ArrayList<String>();
final ArrayList<String> el_anschlusswertliste = new ArrayList<String>();
do {
//Bearbeitungsmaschine aus Datenbank lesen
maschinenname = cursor.getString(1);
anschaffungswert = cursor.getString(2);
raumbedarf = cursor.getString(3);
el_anschlusswert = cursor.getString(4);
maschineliste.add(maschinenname);
anschaffungswertliste.add(anschaffungswert);
raumbedarfliste.add(raumbedarf);
el_anschlusswertliste.add(el_anschlusswert);
} while (cursor.moveToNext());
// dataAdapter zu Spinner hinzufügen
spinner = (Spinner) rootView.findViewById(R.id.sp_m_v2_Maschine);
ArrayAdapter<String> spinner_adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, maschineliste);
spinner_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinner_adapter);
//Auswahl von Spinner Daten füllen entsprechende Felder aus
Spinner spinner1 = (Spinner) rootView.findViewById(R.id.sp_m_v2_Maschine);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
maschineliste.get(position);
TextView gew_maschine, gew_anschaffungswert, gew_raumbedarf, gew_el_anschlusswert;
gew_maschine = (TextView) rootView.findViewById(R.id.tv_m_v2_Maschine);
gew_anschaffungswert = (TextView) rootView.findViewById(R.id.tv_m_v2_Anschaffungswert_Eintrag);
gew_raumbedarf = (TextView) rootView.findViewById(R.id.tv_m_v2_Raumbedarf_Eintrag);
gew_el_anschlusswert = (TextView) rootView.findViewById(R.id.tv_m_v2_el_Anschlusswert_Eintrag);
gew_maschine.setText(maschineliste.get(position).toString());
gew_anschaffungswert.setText(anschaffungswertliste.get(position).toString());
gew_raumbedarf.setText(raumbedarfliste.get(position).toString());
gew_el_anschlusswert.setText(el_anschlusswertliste.get(position).toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
//endregion
return rootView;
}
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
// Anzahl der Tabs
@Override
public int getCount() {
return 2;
}
//Benennung der einzelnen Tabs
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Variante 1";
case 1:
return "Variante 2";
}
return null;
}
}
public void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
sp_Schnittweg = sharedPreferences.getString(SCHNITTWEG, "");
sp_Losgroesse = sharedPreferences.getString(LOSGROESSE, "");
TextView textView = (TextView) findViewById(R.id.tv_m_v1_Anschaffungswert_Eintrag);
TextView tv2 =(TextView) findViewById(R.id.tv_m_v1_Raumbedarf_Eintrag);
textView.setText(sp_Schnittweg);
tv2.setText(sp_Losgroesse);
}
}
编辑:用于保存数据(在C_Produktspezifikation中)并在D_Maschine中加载数据(并在TextViews中显示)的已实现方法。 Helper类与第一个答案中的类完全相同,只有write_to_key更改为saveData,read_from_key更改为加载数据
public void saveData_Produktspezifikation(){
TextView Schnittweg = (TextView) findViewById(R.id.tv_Schnittweg_Eintrag);
EditText Losgroeße = (EditText) findViewById(R.id.et_losgroeße);
XX_Datenspeicher sharePref = new XX_Datenspeicher(this);
String sp_Schnittweg = sharePref.saveData("sp_Produktspezifikation", "SCHNITTWEG", Schnittweg.getText().toString());
String sp_Losgroesse = sharePref.saveData("sp_Produktspezifikation", "LOSGROESSE", Losgroeße.getText().toString());
}
&#13;
public void loadData(){
XX_Datenspeicher sharePref = new XX_Datenspeicher(this);
String sp_Schnittweg = sharePref.loadData("sp_Produktspezifikation", "SCHNITTWEG");
String sp_Losgroesse = sharePref.loadData("sp_Produktspezifikation", "LOSGROESSE");
TextView textview = (TextView) findViewById(R.id.tv_m_v1_Anschaffungswert_Eintrag);
TextView tv2 = (TextView) findViewById(R.id.tv_m_v1_Raumbedarf_Eintrag);
textview.setText(SCHNITTWEG);
tv2.setText(LOSGROESSE);
}
&#13;
答案 0 :(得分:0)
尝试创建一个帮助器类并传入上下文。
import android.content.Context;
import android.content.SharedPreferences;
import static android.content.Context.MODE_PRIVATE;
public class SharedPref {
private Context mContext;
public SharedPref(Context context){
mContext = context;
}
public void write_to_key(String shared_pref, String pref_key, String value_of_key) {
//This block of code will automatically store the key and value in the shared preferences
//All you need to do is provide the sharedpreference, the key you wish to save the value as, and the value
SharedPreferences sharedpreferences = mContext.getSharedPreferences(shared_pref, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(pref_key, value_of_key);
editor.commit();
}
public String read_from_key(String shared_pref, String pref_key) {
//This block of code will automatically read the value in the shared preferences with the provided key
//All you need to do is provide the key you want to read and the value will be returned as a string
SharedPreferences shared = mContext.getSharedPreferences(shared_pref, MODE_PRIVATE);
return (shared.getString(pref_key, ""));
}
}
在构造函数中传递上下文
SharedPref sharePref = new SharedPref(this);
String sp_Schnittweg = sharePref.read_from_key("sp_Produktspezifikation", "SCHNITTWEG");
String sp_Losgroesse = sharePref.read_from_key("sp_Produktspezifikation", "LOSGROESSE");