2013-06-12 16 views
11

Przypuśćmy, że istnieje aktywny zwany główną działalność i istnieją dwa układy zwane Układ1 i Layout2 obie mają kilka przycisków. Domyślnie główną działalność układ jest Układ1 jak następuje:Jak ustawić układ dynamicznie w android

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout1); 

Teraz co zrobiłem faktycznie jest kliknięcie przycisku w Układ1 drugi układ jest ustawiony jak następuje:

someBtn1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      setContentView(R.layout.layout2); 
     } 
    }); 

There to kolejny przycisk w layout2, aby powrócić do layout1 jak poniżej:

someBtn2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      setContentView(R.layout.layout1); 
     } 
    }); 

Problem jest, gdy wróciłem z powrotem do Układ1 następnie OnClickListener z someBtn1 nie działa. Wygląda na to, że muszę ustawić OnClickListener ponownie na someBtn1 z layout1. Jak mogę napisać kod, aby działały idealnie zgodnie z najlepszymi praktykami?

Odpowiedz

4

Jeśli tylko chcą się bawić z aktualnym kodem rozwiązanie Twojego problemu jest to, że słuchacze muszą być redeclared gdy zmiany układu, co następuje:

someBtn1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     setContentView(R.layout.layout2); 

     someBtn2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       setContentView(R.layout.layout1); 
      } 
     }); 
    } 
}); 

someBtn2.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     setContentView(R.layout.layout1); 

     someBtn1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       setContentView(R.layout.layout2); 
      } 
     }); 
    } 
}); 

Alternatywą uniknąć oświadczając słuchaczy dwa razy to zadeklarować dwie metody do obsługi zmiany układu i użyć właściwości przycisku onClick w każdym z układów, na przykład:

public void setLayout1(View view) { 
    setContentView(R.layout.layout1); 
} 

public void setLayout2(View view) { 
    setContentView(R.layout.layout2); 
} 

w layout1.xml:

<Button 
    android:id="@+id/someBtn1" 
    android:onClick="setLayout2"/> 

W layout2.xml:

<Button 
    android:id="@+id/someBtn2" 
    android:onClick="setLayout1"/> 

Jednakże, jeśli chcesz śledzić najlepsze praktyki, najlepsze praktyki nie jest mieszanie układów w tej samej aktywności, ale zamiast zadeklarować dwie różne czynności (po jednej z jego własny układ) i wywołać jedną czynność lub drugą w zależności od klikniętego przycisku. Załóżmy, że jesteś w Activity1 i chce zadzwonić Activity2, a następnie wrócić do Activity1:

W Activity1.java:

someBtn1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     startActivity(new Intent(this, Activity2.class)); 
    } 
}); 

W Activity2.java:

someBtn2.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     finish(); 
    } 
}); 
+0

Tak, wiem o tym. Ale z jakiegoś powodu chcę dynamicznie używać różnych układów w tej samej aktywności. Dzięki za Twoją sugestię. –

+0

Ulepszyłem swoją odpowiedź, aby uniknąć dwukrotnego zadeklarowania słuchaczy, proszę spojrzeć. – Piovezan

0

w momencie oddzwonienia Układ1 dane należy ustawić ponownie.

Można połączyć oba układy w jednym, a następnie użyć ViewFlipper, aby przełączać się między nimi.

1

Jednym ze sposobów na zrobienie tego jest załadowanie obu widoków w onCreate(...), a następnie przełączanie się między nimi przez uczynienie tego, którego nie chcesz, aby był niewidoczny. Coś jak następuje:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LayoutParams default_layout_params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
    View view1 = inflater.inflate(R.layout.layout1, null); 
    addContentView(view1, default_layout_params);   
    View view2 = inflater.inflate(R.layout.layout2, null); 
    addContentView(view2, default_layout_params); 
    view2.setVisibility(View.INVISIBLE); 
    view1.setVisibility(View.VISIBLE); 
    view1.bringToFront(); 
+0

Dzięki za twój kod. Właściwie muszę zmienić 3-4 układy w jednym działaniu. Dlatego wciąż myliłem się, co powinienem użyć. Czy w tym przypadku lepiej jest używać Fragmentu? –

+0

Właśnie napisałem kod, który z powodzeniem stosowałem w dwóch układach. Jestem pewien, że to podejście zadziała więcej, ale "lepsze" i "najlepsze" są subiektywne, więc pozostawię wam wybór! – Stochastically

0

Kiedy seting Layout2, należy również skonfigurować OnClickListener do someBtn1 i odwrotnie, sugeruję coś takiego. Ale tak jak w przypadku odpowiedzi prevoius, ogólnie powinieneś unikać mieszania układów w taki sposób.

public class MainActivity extends Activity { 

    private final View.OnClickListener setLayout1Listener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      setContentView(R.layout.layout2); 
      ((Button)findViewById(R.id.Btn2Id)).setOnClickListener(setLayout2Listener); 
      //do other stuff 
     } 
    }; 

    private final View.OnClickListener setLayout2Listener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      setContentView(R.layout.layout1); 
      ((Button)findViewById(R.id.Btn1Id)).setOnClickListener(setLayout1Listener); 
      //do other stuff 
     } 
    }; 



    @Override 
    public void onCreate(final Bundle savedInstance) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout1); 
     ((Button)findViewById(R.id.Btn1Id)).setOnClickListener(setLayout1Listener); 
     //do other stuff 
    } 
} 
20

Najlepszą praktyką jest używanie fragmentów zamiast zmiany widoku treści.

W swoim kodzie setContentView za pomocą układów odtwarzaj (nadmuchuj) wszystkie swoje widoki za każdym razem, dzięki czemu zestaw setContentView (R.layout.layout1) w jakimś detektorzeBtn2 będzie tworzył nowy przycisk bez powiązanego detektora.

Jeśli nie chcesz korzystać z fragmentów można to zrobić:

private View view1, view2; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    view1 = getLayoutInflater().inflate(R.layout.layout1, null); 
    view2 = getLayoutInflater().inflate(R.layout.layout2, null); 
    setContentView(view1); 

Słuchacze będą:

someBtn1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     setContentView(view2); 
    } 
}); 


someBtn2.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     setContentView(view1); 
    } 
}); 
+0

Chciałbym poznać sposób fragmentacji, czy macie jakieś szybkie przykłady? – Piovezan

+0

Przeczytaj ten http://developer.android.com/guide/components/fragments.html i znajdź przykłady w przykładach SDK i bibliotece pomocy Androida (oba dostępne do pobrania za pomocą Menedżera SDK systemu Android). – j0n0

+0

Jak mogę utworzyć dno przycisk Wstecz, aby powrócić do poprzedniego układu, ale nie do poprzedniego działania? –

Powiązane problemy