Переключиться с одного вида макета на другой и вернуться назад? - PullRequest
2 голосов
/ 20 сентября 2011

хочу создать приложение для Android, которое запускается с макетом main и когда вы нажимаете кнопку (называемую stateButton ), которая находится в этом макете, макет меняется на main2 макет, содержащий другую кнопку (называемую boton2 ), и когда вы нажмете эту кнопку, вы вернетесь к первой основной.

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

Здесь я покажу вам часть кода:

public class NuevoshActivity extends Activity
implements SensorEventListener, OnClickListener {
    private Button stateButton;
    private Button boton2;

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.main); 
        this.stateButton = (Button) this.findViewById(R.id.boton);
        this.boton2 = (Button) this.findViewById(R.id.boton2);      
        stateButton.setOnClickListener(this);
        boton2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v==stateButton) {
            setContentView(R.layout.main2);             
        }
        else if(v==boton2) {
            setContentView(R.layout.main);
        }
    }
}

В сети есть только некоторые изображения, текстовые представления и кнопки.

Но у меня есть некоторые проблемы. Разве это не может быть так просто, или я что-то упустил, или что-то не так?

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Когда вы используете findViewById, вы на самом деле пытаетесь найти представление внутри макета, который вы указали в setContentView.Поэтому повторное использование setContentView может привести к проблемам при попытке проверить кнопки.

Вместо того, чтобы использовать setContentView, я бы добавил 2 макета для экрана как дочерний для view-flipper, который показывает только один дочерний элемент за раз.И вы можете указать индекс, который ребенок показать.Преимущество использования флиппера представления состоит в том, что вы можете легко указать анимацию «in» и «out» для представления, если вам нужна анимация при переключении между представлениями.Это намного более чистый метод, затем снова и снова вызывать setContentView.

2 голосов
/ 20 сентября 2011

FrameLayout прекрасно справляется с этим ... Используйте это с конструктором <include... для загрузки нескольких других макетов, затем вы можете переключаться между ними, используя setvisibility(View.VISIBLE); и setVisibility(View.INVISIBLE); на отдельных макетах.

Например:

Основной XML, включая два других макета:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <include android:id="@+id/buildinvoice_step1_layout" layout="@layout/buildinvoice_step1" android:layout_width="fill_parent" android:layout_height="fill_parent"></include>
    <include android:id="@+id/buildinvoice_step2_layout" android:layout_width="fill_parent" layout="@layout/buildinvoice_step2" android:layout_height="fill_parent"></include>
</FrameLayout>

Код для переключения между макетами:

findViewById(R.id.buildinvoice_step1_layout).setVisibility(View.VISIBLE);
findViewById(R.id.buildinvoice_step2_layout).setVisibility(View.INVISIBLE);

Вам также понадобитсяустановить видимость отдельных макетов при запуске действия (или в формате XML), в противном случае вы увидите их оба - один поверх другого.

0 голосов
/ 20 сентября 2011

Спасибо !!! Вся информация была полезна для понимания многих вещей, и, как прокомментировал C0deAttack, у меня возникли проблемы с кнопкой на main2. Что я сделал, так это установил View.VISIBLE и View.GONE для TextViews и кнопок, которые я хотел в каждом макете. Большое спасибо.

0 голосов
/ 20 сентября 2011

Ваша кнопка boton2 будет иметь значение NULL, поскольку определение кнопки - main2.xml. Единственные виды, которые вы сможете найти, это виды, которые определены в main.xml.

...