在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。