renderizado - problemas con android studio
Intente invocar el método virtual ''int android.text.Layout.getLineCount()'' en una referencia de objeto nula (3)
Creo que el error vino de esta línea.
mySpannable.setSpan(touchableSpan, GeneralFunctions.getText(myTextView).indexOf("Register"), GeneralFunctions.getText(myTextView).length(), 0);
intente cerrar la sesión; obtendrá el valor de índice y el texto de vista de texto del método gettext (textview) e indexOf ().
Recibo aleatoriamente la excepción de puntero nulo, por lo general funciona y en algún momento se bloquea, he buscado mucho pero no recibí ninguna ayuda, ya que no hay una línea adecuada desde donde obtengo ayuda.
También estoy usando el controlador con él.
El error de mi logcat es el siguiente y el código se agrega debajo,
java.lang.NullPointerException: Attempt to invoke virtual method ''int android.text.Layout.getLineCount()'' on a null object reference
at android.widget.TextView.onMeasure(TextView.java:6703)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17547)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
at android.view.View.measure(View.java:17547)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Este es mi código de la siguiente manera, aquí generalmente se bloquea cuando se hace clic en el botón de registro o se olvida en la primera instalación y después de eso generalmente funciona bien, pero en algún momento me da un error.
public class Login extends AppCompatActivity implements View.OnClickListener,ProcessedResult
{
private Handler uiThreadHandler;
private Context context;
private EditText ed_password,ed_Username;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
StorageManager storageManager=new StorageManager(this,"abc");
String accessTokenCheck=storageManager.getValue(Constants.SharedPreferences.LACCESSTOKEN, null);
if(accessTokenCheck!=null)
GeneralFunctions.moveToNextActivity(MainActivity.class,this);
uiThreadHandler = new UIThreadHandler();
new Thread(new Runnable() {
@Override
public void run() {
init();
}
}).start();
}
//Initialization part
private final void init()
{
context=this;
FontsManager.initFormAssets(this, "fonts/Lato-Regular.ttf");
FontsManager.changeFonts(this);
TextView myTextView = GeneralFunctions.findViewByIdAndCast(this, R.id.login_tv_noAccount);
myTextView.setMovementMethod(new LinkTouchMovementMethod());
myTextView.setHighlightColor(getResources().getColor(android.R.color.transparent));
SpannableString mySpannable = new SpannableString(myTextView.getText().toString());
TouchableSpan touchableSpan = new TouchableSpan(Color.parseColor("#606060"),getResources().getColor(R.color.colorBlue),Color.TRANSPARENT) {
@Override
public void onClick(View textView) {
GeneralFunctions.simpleMoveToNextActivity(Register.class, context);
}
};
mySpannable.setSpan(touchableSpan, GeneralFunctions.getText(myTextView).indexOf("Register"), GeneralFunctions.getText(myTextView).length(), 0);
myTextView.setText(mySpannable, TextView.BufferType.SPANNABLE);
TextView tv_forgetPassword = GeneralFunctions.findViewByIdAndCast(this,R.id.login_tv_foregetPassword);
GeneralFunctions.setTextColorSelector(Color.parseColor("#606060"),getResources().getColor(R.color.colorBlue),tv_forgetPassword);
tv_forgetPassword.setOnClickListener(this);
ed_password = (EditText) findViewById(R.id.login_ed_password);
ed_Username = (EditText) findViewById(R.id.login_ed_usrName);
ed_password.setTransformationMethod(new AsteriskPasswordTransformationMethod());
Button bt_Login= GeneralFunctions.findViewByIdAndCast(this,R.id.login_bt_signin);
setSelector(R.drawable.big_green_btn_normal, bt_Login);
Button bt_linkedInd= GeneralFunctions.findViewByIdAndCast(this,R.id.login_bt_linkedin);
setSelector(R.drawable.big_blue_btn_normal, bt_linkedInd);
}
private final void setSelector(final int resourceId,final Button button)
{
button.setOnClickListener(this);
try
{
String name = getNameofResyrce(activity,resourceId);
String newString=name.replace("normal","pressed");
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed}, getDrawablebyName(activity,newString));
states.addState(new int[] {android.R.attr.state_focused},getDrawablebyName(activity, newString));
states.addState(new int[]{}, getDrawablebyName(activity, name));
if(view instanceof Button)
((Button)view).setBackground(states);
else
if(view instanceof ImageView)
((ImageView)view).setImageDrawable(states);
} catch (Exception e)
{
}
}
public static synchronized Drawable getDrawablebyName(Context context,String name)
{
Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(name, "drawable", context.getPackageName());
return resources.getDrawable(resourceId);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.login_bt_linkedin:
{
DWebView transparentDialog = DWebView.newInstance();
showProgressDialog(transparentDialog, Constants.DialogConstants.WEB);
}
break;
case R.id.login_bt_signin:
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.VALIDATION);
break;
case R.id.login_tv_foregetPassword:
GeneralFunctions.simpleMoveToNextActivity_Without_history(ForgetPassword.class, context);
break;
}
}
//Listener part
@Override
public <IResponse, IMethod> void processedResult(IResponse iResponse, IMethod iMethod) {
switch (iMethod.toString())
{
case "back":
finish();
break;
case "showProgress":
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.SHOWDIALOG);
break;
case "hideProgress":
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.HIDEDIALOG);
break;
}
}
//Handler part
private class UIThreadHandler extends Handler {
@Override
public void handleMessage(Message msg)
{
switch (msg.what) {
case Constants.ActivityBasicsCode.SETERROR:
{
CustomException exception=(CustomException)msg.obj;
TextView editText=exception.getTextView();
editText.setError(exception.getMessage());
editText.setFocusable(true);
editText.requestFocus();
}
break;
case Constants.ActivityBasicsCode.HIDEDIALOG:
hideProgressDialog(Constants.DialogConstants.Transparent);
break;
case Constants.ActivityBasicsCode.SHOWDIALOG: {
DTDialog dtDialog=DTDialog.newInstance();
showProgressDialog(dtDialog,Constants.DialogConstants.Transparent);
}
break;
case Constants.ActivityBasicsCode.VALIDATION: {
//Here validation is done in separate thread
new Thread(new Runnable() {
@Override
public void run() {
try
{
if (Validation.validate(Login.this))
GeneralFunctions.moveToNextActivity(MainActivity.class, context);
} catch (CustomException e)
{
//Catch exception for validation is thrown here
Message message = uiThreadHandler.obtainMessage(Constants.ActivityBasicsCode.SETERROR);
message.obj=e;
uiThreadHandler.sendMessage(message);
}finally {
uiThreadHandler.sendEmptyMessage(Constants.ActivityBasicsCode.HIDEDIALOG);
}
}
}).start();
break;
}
}
super.handleMessage(msg);
}
}
public final<T extends DialogFragment> void showProgressDialog(T currentDialog,String tagName)
{
FragmentManager fragmentManager =getSupportFragmentManager();
currentDialog.show(fragmentManager, tagName);
}
public final void hideProgressDialog(String tagName)
{
FragmentManager fragmentManager =getSupportFragmentManager();
DialogFragment transparentDialog = (DialogFragment)fragmentManager.findFragmentByTag(tagName);
if (transparentDialog == null) {
return;
}
transparentDialog.dismiss();
}
}
Archivo XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center">
<ImageView style="@style/imageview"
android:layout_marginTop="@dimen/_7sdp"
android:src="@mipmap/ic_launcher"/>
<EditText
android:tag="@string/login_emailId_phone"
android:layout_marginTop="@dimen/_12sdp"
style="@style/edittext"
android:drawableLeft="@drawable/user_icon"
android:id="@+id/login_ed_emailPhone"
android:inputType="text"/>
<EditText
android:tag="@string/login_password"
android:layout_marginTop="@dimen/_12sdp"
android:drawableLeft="@drawable/password_icon"
android:id="@+id/login_ed_password"
android:inputType="textPassword"
android:hint="@string/login_password"
style="@style/edittext"/>
<TextView
android:layout_marginTop="@dimen/_11sdp"
android:id="@+id/login_tv_foregetPassword"
android:text="@string/login_forgetPassword"
style="@style/textView"
android:textColor="#606060"
android:textStyle="normal"/>
<Button
android:layout_marginTop="@dimen/_30sdp"
android:id="@+id/login_bt_signin"
style="@style/button"
android:text="@string/login_singin"
android:background="@drawable/big_green_btn_normal"
/>
<cl.tempclick.ui.custom_view.LineThroughTextView
android:layout_marginTop="@dimen/_12sdp"
app:android_textColor="#606060"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:lineHeight="@dimen/_2sdp"
app:lineColor="@color/colorGray"
app:android_textSize="@dimen/_15sdp"
app:android_text="@string/login_or"
app:textPadding="@dimen/_10sdp"/>
<Button
android:layout_marginTop="@dimen/_12sdp"
android:id="@+id/login_bt_linkedin"
style="@style/button"
android:text="@string/login_linkedin"
android:background="@drawable/big_blue_btn_normal"
/>
<TextView
android:layout_marginTop="@dimen/_12sdp"
android:id="@+id/login_tv_noAccount"
android:text="@string/login_noAccount"
style="@style/textView"
android:textStyle="normal"
android:textColor="#606060"
android:layout_marginBottom="@dimen/_7sdp"/>
</LinearLayout>
<ViewStub
android:id="@+id/login_vs_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:layout="@layout/empty_view" />
No debe llamar a init()
(o cualquier código que toque la interfaz de usuario de Android) en un subproceso que no sea de la interfaz de usuario.
Pruebe el método thread.join()
, en el que está llamando al método init()
.