2012-11-30 2 views
0

클래스 (활동)의 매개 변수를 다른 클래스로 전달하는 스 니펫 코드가 있습니다. 그렇게하려면, sharedPreferences을 사용했지만, 내 secondclass에서 주 활동에 저장된 값을 얻으려고 시도합니다. java.lang.Nullpointer 예외가 발생합니다. 내가 여기서 뭘 잘못하고 있니?클래스에서 안드로이드 전달 매개 변수

E/AndroidRuntime(10622): FATAL EXCEPTION: main 
E/AndroidRuntime(10622): java.lang.NullPointerException 
E/AndroidRuntime(10622): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) 
E/AndroidRuntime(10622): at android.app.Activity.getLocalClassName(Activity.java:3488) 
E/AndroidRuntime(10622): at android.app.Activity.getPreferences(Activity.java:3522) 
+0

스택 추적을 게시 할 수 있습니까? –

+0

추가했습니다. 체크 아웃 ... –

+0

전체 스택 추적이 더 좋을 것입니다. –

답변

0
final main m=new main(); 

그것은 잘못된 것입니다 : 여기

public class Secondclass extends Activity { 
//other functions.... 
private void get_file_name() { 

     final main m=new main(); 
     String myvalue=m.set_paramater(); 
     //I want to access FOLDER_NAME here 
     Log.e("TAG","the value "+myvalue); 

} 
} 

public class main extends Activity{ 
String FOLDER_NAME; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     FOLDER_NAME="a_name"; 
     Save_file_name("APP_NAME",FOLDER_NAME); 
} 
private void Save_file_name(String key,String value){ 
     SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, value); 
     editor.commit(); 

     } 

public String set_paramater(){ 
     SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
     String strSaveddata = sharedPreferences.getString("APP_NAME", ""); 
     return strSaveddata; 
    } 
} 

} 

는 추적 파일입니다! 당신이
SharedPreferences sharedPreferences = gePreferences(MODE_PRIVATE); 

를 사용으로 Context을 요구한다. 전화가 걸려 올 때 null입니다. set_paramater()

Secondclassset_paramater()을 그냥 입력하십시오. 그것은 당신의 문제를 해결할 것입니다!

package com.example.test; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class main extends Activity { 
    String FOLDER_NAME; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FOLDER_NAME = "a_name"; 
     Save_file_name("APP_NAME", FOLDER_NAME); 
     Button nextButton=(Button)findViewById(R.id.next_button); 
     nextButton.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       startActivity(new Intent(main.this,Secondclass.class)); 

      } 
     }); 

    } 

    private void Save_file_name(String key, String value) { 
     SharedPreferences sharedPreferences = getSharedPreferences(
       "myPreffFile", MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, value); 
     editor.commit(); 

    } 

} 

및 ...

package com.example.test; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class Secondclass extends Activity { 
    // other functions.... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button nextButton = (Button) findViewById(R.id.next_button); 
     nextButton.setText("Show Value"); 
     nextButton.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       get_file_name(); 

      } 
     }); 

    } 

    private void get_file_name() { 
     Toast.makeText(this, set_paramater(), Toast.LENGTH_SHORT).show(); 

    } 

    public String set_paramater() { 
     SharedPreferences sharedPreferences = getSharedPreferences(
       "myPreffFile", MODE_PRIVATE); 

     String strSaveddata = sharedPreferences.getString("APP_NAME", ""); 
     return strSaveddata; 
    } 
} 

참고 : 완전히 테스트 코드입니다. 나는 이걸 실천한다. 아직도 잘못이왔다면 그 잘못은 다른 곳에서있다.

+0

내 코드를 변경 사항으로 업데이트 할 수 있습니까? –

+0

그것은 간단합니다! 내 편집을 참조하십시오 –

+0

아니, 그것은 작동하지 않았다, 나는 같은 오류가 발생했습니다 ... –

0

Activity.getPreferences()이 활동에 비공개 인 환경 설정에 액세스하기 위해 SharedPreferences 개체를 검색합니다. 이는 두 가지 활동이 다르다는 것을 의미합니다. SharedPreferences.

당신은 같은 얻기 위해 같은 이름을 가진 Context.getSharedPreferences()을 사용할 수 있습니다 것은 SharedPreferences

+0

예제 코드를 제공 할 수 있습니까? –

1

라인 귀하의 경우, 다른 활동에서 활동을 인스턴스화하는 나쁜 관행입니다 :

final main m=new main(); 

안드로이드의 생성을 처리합니다 모든 활동과 자신이 직접 해선 안됩니다. 이 방법을 사용하면 활동에 유효한 응용 프로그램 컨텍스트가 없습니다. 유효한 응용 프로그램 컨텍스트가 없으면 getPreferences(MODE_PRIVATE)은 null을 반환합니다.

또한, 사용 아마도 더 : 당신의 활동에 대한 환경 설정을 비공개로 설정됩니다 getPreferences(...)를 사용

PreferenceManager.getDefaultSharedPreferences(this) 

. getDefaultSharedPreferences(this)을 사용하면 환경 설정을 만든 활동이 아닌 다른 활동에 환경 설정을 적용 할 수 있습니다. 이를 통해 두 가지 활동에서 데이터를 공유 할 수 있습니다.

+0

당신이 말하는 것을 구현하기위한 예를들 수 있습니까? –

+0

또는 제안한 변경 사항으로 내 코드를 업데이트하고 싶습니까? –

0

문제에 대한 답이 아니라 단지 정보입니다. Android Application 클래스를 확장하여 애플리케이션 활동간에 데이터를 공유 할 수 있습니다.

응용 프로그램 클래스를 확장하고 자신 만의 클래스를 만듭니다.

package com.foo.bar; 
import android.app.Application; 
public class MyApplication extends Application { 
    private boolean foo; 
    @Override 
    public void onCreate() { 
     foo = false; 
    } 
    public void SetFoo(boolean fooValue) { 
     foo = fooValue; 
    } 
    public boolean GetFoo() { 
     return foo; 
    } 
} 

매니페스트가 애플리케이션 클래스를 설정해야합니다.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.foo.bar" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="16"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:name=".MyApplication"> 
     <activity 
      android:label="@string/app_name" 
      android:name=".MyActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

귀하는 이와 같은 활동 내에서 애플리케이션 클래스 인스턴스에 액세스 할 수 있습니다.

MyApplication mApp = (MyApplication)getApplication();