2010-12-04 3 views
0

CharSequence로 변환해야하는 String이 있습니다. 데이터는 반드시 다음과 같이 반환 된 문자열이어야합니다.자바에서 CharSequence 또는 char []로 문자열 변환

String ip = pref.getString("ip", "0.0.0.0"); 

사용자 환경 설정 문자열을 가져옵니다.

final void setText(int resid) 
final void setText(int resid, TextView.BufferType type) 
final void setText(char[] text, int start, int len) 
void setText(CharSequence text, TextView.BufferType type) 
final void setText(CharSequence text) 

내가 먼저 바닥 기능을 사용하여 시도,하지만 당신은 (문자열의 CharSequence를 구현하더라도) 그것을 문자열을 전달할 수 없습니다 : 데이터는 이러한 기능의 전달 될 필요가있다. 그것은 컴파일되지만 충돌합니다. 이 작업 중 하나를하지 않습니다 같은 함수 호출에서의 CharSequence에 캐스팅 :

ipIn.setText((CharSequence)ip); 

다음 내가 호출하여 배열 버전을 사용하여 시도 :

여전히 충돌합니다. 여기에 'ADB 로그 캣'의 출력은 다음과 같습니다

E/AndroidRuntime(16642): FATAL EXCEPTION: main 

E/AndroidRuntime(16642): java.lang.NullPointerException 

E/AndroidRuntime(16642): at com.conceptualsystems.android4api.sms.smsMobile.onCreateDialog(smsMobile.java:81) 

E/AndroidRuntime(16642): at android.app.Activity.onCreateDialog(Activity.java:2472) 

E/AndroidRuntime(16642): at android.app.Activity.createDialog(Activity.java:881) 

E/AndroidRuntime(16642): at android.app.Activity.showDialog(Activity.java:2547) 

E/AndroidRuntime(16642): at android.app.Activity.showDialog(Activity.java:2514) 

E/AndroidRuntime(16642): at com.conceptualsystems.android4api.sms.smsMobile.onOptionsItemSelected(smsMobile.java:120) 

E/AndroidRuntime(16642): at android.app.Activity.onMenuItemSelected(Activity.java:2195) 

E/AndroidRuntime(16642): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) 

E/AndroidRuntime(16642): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143) 

E/AndroidRuntime(16642): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 

E/AndroidRuntime(16642): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532) 

E/AndroidRuntime(16642): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 

E/AndroidRuntime(16642): at android.view.View$PerformClick.run(View.java:8816) 

E/AndroidRuntime(16642): at android.os.Handler.handleCallback(Handler.java:587) 

E/AndroidRuntime(16642): at android.os.Handler.dispatchMessage(Handler.java:92) 

E/AndroidRuntime(16642): at android.os.Looper.loop(Looper.java:123) 

E/AndroidRuntime(16642): at android.app.ActivityThread.main(ActivityThread.java:4627) 

E/AndroidRuntime(16642): at java.lang.reflect.Method.invokeNative(Native Method) 

E/AndroidRuntime(16642): at java.lang.reflect.Method.invoke(Method.java:521) 

E/AndroidRuntime(16642): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 

E/AndroidRuntime(16642): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 

E/AndroidRuntime(16642): at dalvik.system.NativeStart.main(Native Method) 

W/ActivityManager(1099): Force finishing activity 

어떤 흥미로운 것은 내가 먼저 텍스트를 설정하면 AlertDialog.Builder.setView (보기)가 호출 될 때 충돌 만의 setText에 충돌 내가 setView 후를 호출하는 경우이다 . 여기에 상황에 물건을 넣어 일부 코드입니다 :

final View dialogLayout = inflater.inflate(R.layout.dialog_wifi_pref, null); 
builder = new AlertDialog.Builder(this); 
builder.setView(dialogLayout); 
builder.setTitle(R.string.opt_ip_config); 
String ip = pref.getString("ip", "0.0.0.0"); 
String port = pref.getString("port", "3005"); 
EditText ipIn = (EditText)findViewById(R.id.wifi_ip_in); 
EditText portIn = (EditText)findViewById(R.id.wifi_port_in); 
//ipIn.setText(ip.toCharArray(), 0, ip.toCharArray().length-1); 
//portIn.setText((CharSequence)port.toString()); 
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     // change to sqlite ///// 
     ///////////////////////// 
     //nothing here yet 
     dialog.dismiss(); 
    } 
}); 
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     dialog.cancel(); 
    } 
}); 
dialog = builder.create(); 

이는이 onCreateDialog 재정의 일부이며, case 문 내부에 존재한다. '대화 상자', '인포 터'및 '빌더'는 위에서 정의 된대로 적절하게 정의됩니다. 그리고 말했듯이, 오류는 setView 또는 setText를 먼저 호출하는지에 따라 달라집니다. 내가 실제로해야 할 일이 무엇인지 모르겠습니다.

결론 :이 EditText 상자에 문자열을 가져와야합니다. 나는 어떻게합니까?

+0

문자열을 메서드로 전달할 수 있어야합니다. 그 충돌에 대한 스택 추적은 무엇입니까? –

+0

그게 제가 시도한 첫 번째 일이었습니다. 그것은 컴파일하지만 NullPointerException으로 주석 처리 한 줄에서 충돌합니다 : setText. – moonlightcheese

답변

0

고정.

이 문제는 실제로 클래스 캐스팅과 관련이 없습니다. 문제는 대화 레이아웃의 뷰를 참조하는 방식이었습니다.

EditText ipIn = (EditText)dialogLayout.findViewById(R.id.wifi_ip_in); 

난 당신이 대화 상자가 팽창 할 때, 당신은 명시 적으로 팽창 된 인스턴스를 참조 할 것 같아요, 그렇지 않으면 안드로이드는 어떤 인스턴스를 알 수 없습니다 :이 라인

EditText ipIn = (EditText)findViewById(R.id.wifi_ip_in); 

: 나는이 줄을 교체 변경하려면 대화? null 포인터는 실제로 EditText ipIn 대화 상자가 제대로 설정되지 않았기 때문입니다.

기여한 모든 사람에게 감사드립니다.

0

코드에 대해 확실하지 않은 점이 있지만 변환에 문제가있는 경우 가장 좋은 방법은 같은 활동에 작업 샘플에서이 변환을 만들려고하는 것입니다 :

public class test extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try{ 
     //Here do your converting operation 
     // 
     }catch(Exception e){ 
      //show any error during converting 
     } 
     android.util.Log.v("conv", 
     //here you can show results in logcat 
     ); 

    } 
} 

당신이 예상받을 경우 결과는, 고정 된 데이터와 함께 대화 상자를 확인합니다. 최종 단계 믹스 논리 (변환) +보기 (대화) .. 당신은 행복 할거야;)

1

디버거를 통해 실행 해보십시오. 아마도 NullPointerException, null 참조를 메서드에 전달하고 있습니다. 이는 코드가 컴파일되지만 런타임에 실패하는 이유를 설명합니다.

0

가장 가능성있는 설명은 설정하려는 텍스트 문자열이 null입니다. 두 번째 대안은 입니다. ipnull 일 경우 확실히 NPE를 던집니다. 첫 번째 대안이 가장 가능성이 높습니다. NPE가 조금 후에 발생할 수 있습니다.

EditText.setText()을 잘못된 스레드에서 호출 한 경우 이러한 상황이 발생할 수 있습니다. 그러나 당신이 위젯을 만드는 과정에 있기 때문에 그것은 여기에서 문제가되어서는 안됩니다.