Невозможно обновить текстовое представление из метода обратного вызова - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть интерфейс, реализованный в MainActivity, и внутри этого метода обратного вызова я хочу обновить свой TextView, но я получаю исключение nullpointer.

Это мой класс MainActivity

public class MainActivity extends AppCompatActivity implements GenericCallback
{

    Context mcontext;
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mcontext = this;

        Button btn = findViewById(R.id.btn);
        tv = findViewById(R.id.tv);
        btn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });

    }

    @Override
    public void doSomething(Context context, String... a)
    {
        Toast.makeText(context,"Calback"+a[0]+a[1],Toast.LENGTH_SHORT).show();
        tv = findViewById(R.id.tv);//Line 43
        tv.setText(a[0]+a[1]);
    }

Мой интерфейс выглядит так

public interface GenericCallback
{
    void doSomething(Context context, String... a);
}

My SecomdActivity

public class SecondActivity extends AppCompatActivity
{
    Context context;
    GenericCallback genericCallback = new MainActivity();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        context = this;
        String a="Secomd",b = "Activity";
        genericCallback.doSomething(context,a,b);
        finish();
    }
}

StackTrace

Причина: java.lang.NullPointerException: попытка вызвать виртуальную Метод 'android.view.Window $ Callback android.view.Window.getCallback () 'для пустой ссылки на объект на android.support.v7.app.AppCompatDelegateImplBase. (AppCompatDelegateImplBase.java:117) на android.support.v7.app.AppCompatDelegateImplV9. (AppCompatDelegateImplV9.java:149) на android.support.v7.app.AppCompatDelegateImplV14. (AppCompatDelegateImplV14.java:56) на android.support.v7.app.AppCompatDelegateImplV23. (AppCompatDelegateImplV23.java:31) на android.support.v7.app.AppCompatDelegate.create (AppCompatDelegate.java:200) на android.support.v7.app.AppCompatDelegate.create (AppCompatDelegate.java:183) на android.support.v7.app.AppCompatActivity.getDelegate (AppCompatActivity.java:519) на android.support.v7.app.AppCompatActivity.findViewById (AppCompatActivity.java:190) на android.com.callback.MainActivity.doSomething (MainActivity.java:43) на android.com.callback.SecondActivity.onCreate (SecondActivity.java:21)

Я уже знаю, что такое nullpointer, я уже упоминал это и это

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Вы можете использовать EventBus Library

Для установки

compile 'org.greenrobot: eventbus: 3.1.1'

Сначала создайте класс Java

public class MsgEvent {
String oo;

public String getOo() {
    return oo;
}

public void setOo(String oo) {
    this.oo = oo;
}
}

Тогда в SecondActivity

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    context = this;
    String a="Secomd",b = "Activity";
    MsgEvent msgEvent = new MsgEvnet();
    msgEvent.setOo(a);
    EventBus.getDefault().post(msgEvent);
    finish();
}

Затем в MainActivity

@Override
public void onStart() {
 super.onStart();
 EventBus.getDefault().register(this);
}

@Override
public void onStop() {
 super.onStop();
 EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MsgEvent event) {
String value = event.getOo();
}
0 голосов
/ 27 апреля 2018

Вы можете использовать BroadcastReceiver

проверьте приведенный ниже пример

MainActivity

public class MainActivity extends AppCompatActivity {


    TextView mTitle;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = findViewById(R.id.toolbar_title);

        startActivity(new Intent(this, SecondActivity.class));

    }

    private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            mTitle.setText(intent.getStringExtra("DATA"));
            Toast.makeText(context, "recieved text : " + intent.getStringExtra("DATA"), Toast.LENGTH_SHORT).show();

        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("MY_ACTION");
        registerReceiver(myBroadcastReceiver, filter);

        super.onResume();
    }

    @Override
    protected void onPause() {

        super.onPause();
    }

}

Форма XML MainActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbarIcon"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">


    <TextView
        android:id="@+id/toolbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="Nilesh"
        android:textStyle="bold" />


</LinearLayout>

Second_activity

    public class SecondActivity extends AppCompatActivity {

    TextView tvText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        getSupportActionBar().setTitle("SECOND Activity");


        tvText = findViewById(R.id.tvText);

        tvText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast();
            }
        });

    }

    public void sendBroadcast() {

        Intent broadcast = new Intent();
        broadcast.putExtra("DATA", "MY NAME IS NILESH");
        broadcast.setAction("MY_ACTION");
        sendBroadcast(broadcast);
    }
}

LAYOUT для второго занятия

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <TextView
        android:layout_width="match_parent"
        android:id="@+id/tvText"
        android:text="Click to Send Broadcas"
        android:layout_height="wrap_content" />

</LinearLayout>
0 голосов
/ 27 апреля 2018

Причина, по которой вы получаете это нулевое исключение, заключается в том, что ваше представление MainActivity не является завышенным, поскольку оно не создается платформой.

Вы можете создать метод получения экземпляра из своего первого действия.

private static GenericCallback instance;

public static GenericCallback getHandler() {
    return instance;
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
     ...
     instance = this;
     ...
}

А затем во втором упражнении получите этот экземпляр вместо того, чтобы создавать экземпляр занятия.

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    context = this;
    String a="Secomd",b = "Activity";
    GenericCallback genericCallback = MainActivity.getHandler();
    genericCallback.doSomething(context,a,b);
    finish();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...