在Java(Android 1.6 API)中将字符串转换为CharSequence或char[]

在Java(Android 1.6 API)中将字符串转换为CharSequence或char[],java,android,Java,Android,我有一个字符串需要转换成字符序列。数据必须是字符串,因为它是从以下位置返回的: 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)

我有一个字符串需要转换成字符序列。数据必须是字符串,因为它是从以下位置返回的:

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)
我首先尝试使用bottom函数,但无法向其传递字符串(即使字符串实现了CharSequence)。它会编译,但会崩溃。在函数调用中将其强制转换为CharSequence也不起作用:

ipIn.setText((CharSequence)ip);
然后,我通过调用以下命令尝试使用阵列版本:

ipIn.setText(ip.toCharArray(), 0, ip.toCharArray().length-1);
仍然崩溃。以下是“adb logcat”的输出:

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(View)时它会崩溃,但如果我在setView之后调用它,则setText会崩溃。下面是一些代码,用于将内容放到上下文中:

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。我不确定我应该先做哪一个


底线是:我必须在这个文本框中输入一个字符串。我该怎么做?

我不确定你的代码。但是如果你在转换时遇到问题。最好的方法是尝试在活动中的工作示例中进行此转换,如:

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 
         );

    }
}
如果得到预期结果,请使用固定数据检查对话框。
最后一步混合逻辑(转换)+视图(对话框)。。你会很高兴的……)

尝试通过调试器运行此操作。您可能正在将null引用传递到方法中,从而传递NullPointerException。这可以解释为什么代码可以编译,但在运行时失败。

最可能的解释是您设置的文本字符串是
null
。第二种选择是
ip.tocharray()
,如果
ip
null
,则肯定会抛出NPE。第一种选择很可能也会,尽管NPE可能会晚一点发生

在其他情况下,如果在错误的线程中调用
EditText.setText()
,则可能会遇到此类问题。但这不应该是问题所在,因为您正在创建小部件。

已修复

这个问题实际上与班级的角色扮演毫无关系。问题在于我引用对话框布局视图的方式。我替换了这一行:

EditText ipIn = (EditText)findViewById(R.id.wifi_ip_in);
EditText ipIn = (EditText)dialogLayout.findViewById(R.id.wifi_ip_in);
这一行:

EditText ipIn = (EditText)findViewById(R.id.wifi_ip_in);
EditText ipIn = (EditText)dialogLayout.findViewById(R.id.wifi_ip_in);
我猜当你膨胀一个对话框时,你必须显式地引用膨胀的实例,否则android将不知道该更改哪个对话框实例?因此,空指针实际上是未正确设置的对话框EditText ipIn


感谢所有贡献者。

您应该能够将字符串传递给该方法。那次撞车的原因是什么?当然,这是我第一次尝试的。它可以编译,但在我注释掉的行中使用NullPointerException崩溃:setText。