Как я могу использовать интерфейс для создания простого моста между двумя действиями? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь научиться использовать интерфейсы в моем коде android JAVA. Я создал это простое приложение, которое хочет показывать тост при нажатии кнопки в MainActivity, но я хочу go через интерфейс и SecondActivity, чтобы добиться этого ... Но я не могу получить работа выполнена ..... Поскольку отладчик показывает, что экземпляр интерфейса в SecondActivity имеет значение null при выполнении его метода onCreate.

Очевидно, logi c неверен, но я могу Не понимаю, что именно не так ... Я учусь сам, любая помощь приветствуется!

Я полный новичок, поэтому, пожалуйста, будьте добры.

Кроме того, я включил весь приведенный ниже код:


publi c class MainActivity расширяет AppCompatActivity реализует интерфейс {

Button myButton;
Intent mainIntent;
SecondActivity myMain2;

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

    myButton = findViewById(R.id.button);

    myMain2 = new SecondActivity();
    myMain2.setMyInterface(this);

    myButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mainIntent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(mainIntent);
        }
    });
}

@Override
public void showOnClick() {
    Toast.makeText(myMain2, "Clicked!", Toast.LENGTH_SHORT).show();
}

}


publi c interface Интерфейс {

void showOnClick ();

}


publi c класс SecondActivity расширяет AppCompatActivity {

private Interface myInterface;

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

    if (myInterface != null) {
        myInterface.showOnClick();
    }
}

public void setMyInterface(Interface myInterface){
    this.myInterface =  myInterface;
}

}


Заранее спасибо!

ИЗМЕНИТЬ (1):

public class MainActivity extends AppCompatActivity implements 
MyInterface{

Intent intent_mainActivity;
WorkoutListFragment myWorkoutFrag;

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

    myWorkoutFrag = new WorkoutListFragment();
    myWorkoutFrag.setListener(this);

}

@Override
public void itemClicked(long id) {
    intent_mainActivity = new Intent(this, DetailActivity.class);
    intent_mainActivity.putExtra(DetailActivity.EXTRA_WORKOUT_ID, 
(int)id);
    startActivity(intent_mainActivity);
}

}

public interface MyInterface {
void itemClicked(long id);
}
* 1 034 *
public class WorkoutListFragment extends ListFragment {

public WorkoutListFragment() {}

private MyInterface listener;

public void setListener(MyInterface myInterface){
    this.listener = myInterface;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    String [] names = new String[Workout.workouts.length];
    for (int i = 0; i < names.length; i++){
        names[i] = Workout.workouts[i].getName();
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<>(
            inflater.getContext(), android.R.layout.simple_list_item_1, 
names);

    setListAdapter(adapter);

    return super.onCreateView(inflater, container, savedInstanceState);

}
//
//    @Override
//    public void onAttach(Context context) {
//        super.onAttach(context);
//        this.listener = (MyInterface)context;
//    }

@Override
public void onListItemClick(ListView listView, View itemView, int 
position, long id){
    if (listener != null){
        listener.itemClicked(id);
        }
    }
}

1 Ответ

0 голосов
/ 07 мая 2020

Я просто указываю, что вы делаете не так.

myMain2 = new SecondActivity();
myMain2.setMyInterface(this);
mainIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(mainIntent);

Вы устанавливаете интерфейс для myMain2, но при отображении активности с помощью кнопки Android не отображается ваш myMain2, будет создан новый экземпляр SecondActivity на основе вашего намерения. Это означает, что когда SecondActivity вызывает onCreate, у него нет экземпляра myInterface.

В основном связь между двумя действиями должна осуществляться с использованием startActivityForResult или в каком-то особом случае с использованием шаблона Broadcast или шины событий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...