Какой вид выбирается при переходе к другому действию Android

#android

#Android

Вопрос:

После долгих исследований и поиска уроков я пришел, чтобы найти ответы на некоторые вопросы, которые у меня были самостоятельно. Теперь, мой последний вопрос таков: если у меня есть View переменная экземпляра, перенесенная с предыдущей Activity , и она не работает для уточнения findViewbyId() функции до текущего исходного файла, что я должен использовать View в качестве экземпляра my findViewById() ?

Вот код, который у меня есть:

 public class login_fb extends Activity implements View.OnClickListener {

    private static final String EMAIL = "email";
    private static AccessToken accessToken = null;
    private static boolean isLoggedIn = false;
    private static String deduction = "";
    private static String income = "";
    private static CallbackManager callbackManager = CallbackManager.Factory.create();
    private static boolean hasItemized = false;
    private FireMissiles fireMissiles = new FireMissiles();

    public void gotoRcpts (View view)
    {
        signIn( view );
    }

    public void getSuggestions(View view) throws ParserConfigurationException, ParseException, SAXException, IOException {
        checkPermsOfStorage( this );
        setContentView( R.layout.content_search );
        Intent intent = Intent.makeMainActivity( lists.newComponentActivity().getComponentName() );
        startActivity( intent );
        lists listing = new lists(view, view.getContext()); //everything works to here.
        listing.display( view );  // This is where I call the function below.
    }
  

Вот вторая половина кода

 public void display(View view)
{
    // I feel the issue is here, but why can I get 
    listViewP = view.findViewById( R.id.view_personal );
    listViewB = view.findViewById( R.id.view_business );
    // now create an adapter class
    Log.d("amp;amp;amp;amp;", String.valueOf(this.mpTitle.size()));
    if (this.mpTitle != null amp;amp; listViewP != null) { //if I don't check for null, error
        MyAdapter adapterP = new MyAdapter( this, listed_views, mpTitle, content_search, mContext);
        listViewP.setAdapter( adapterP ); // here's where my error is.
    }
    if (this.mbTitle != null amp;amp; listViewB != null) { // if I don't check for null error
        MyAdapter adapterB = new MyAdapter( this, listed_views, mbTitle, content_search, mContext);
        listViewB.setAdapter( adapterB ); // here also there's an error.
    }
}
  

Два ListView s — это view_personal , и view_business .

Комментарии:

1. private FireMissiles fireMissiles = new FireMissiles(); — Я ухожу отсюда!

2. @ReazMurshed Я понял это прямо из документов Google для разработчиков

Ответ №1:

A View — это компонент пользовательского интерфейса — при Activity запуске вы обычно вызываете setContentView onCreate , передавая файл макета XML. Что это делает, так это создает все разные View s в вашем файле макета, устанавливает их параметры и присваивает им такие вещи, как id вы им указали.

Таким образом, вы получаете иерархию макетов с такими вещами, как a TextView , который имеет id of titleText или что-то еще. Вы можете найти этот конкретный объект, вызвав findViewById() a View (обычно макет верхнего уровня), и он будет искать все его View потомки в иерархии макетов, пока не найдет тот, который соответствует этому имени идентификатора.

Это View все экземпляры, которые создаются, если вы уничтожите действие и воссоздадите его заново, у вас будет совершенно новый набор объектов просмотра. Таким образом, вы не сохраняете экземпляры (и вам определенно не следует пытаться!), И если вы перейдете к другому Activity , вы определенно не увидите те же объекты просмотра снова.


Поэтому, когда вы вызываете findViewById новое действие, используя то же id , что и в предыдущем действии, вы не находите тот же экземпляр View объекта — вы просто находите тот, которому присвоен тот же идентификатор. Вы можете повторно использовать идентификаторы, подобные этому, единственная проблема заключается в том, что если у вас более одного в одной и той же иерархии макетов findViewById , вы найдете только первый, который соответствует.

Если вы получаете нулевые ссылки для listViewP etc., у вас нет представления с этим идентификатором в вашем макете (или, по крайней мере, не под тем View , к которому вы обращаетесь findViewById ). Если они существуют в другом Activity , вы не можете получить к ним доступ — это действие не запущено, оно не существует. Если ActivityB вы хотите что-то изменить ActivityA , ему необходимо передать ему данные, поэтому ActivityA он может с этим справиться.