Переключение между 2 раскладками в андроид активности - PullRequest
8 голосов
/ 11 августа 2011

У меня есть 2 разных файла макета, которые я хочу использовать для изменения одних и тех же данных. Я должен был переключиться на свой макет для «вида редактирования», который позволяет пользователю изменять данные графика, а затем позволяет им переключаться обратно на «подробный вид», отображающий подробный график (с использованием библиотеки androidplot).

Моя проблема в том, что при переключении обратно в мой «вид редактирования» мои графические линии пропадают, и рисуются только оси (поэтому компоновка переключается, и вызывается onDraw () для моего представления графика). Все хранится в одной и той же активности, поэтому я не понимаю, почему это не работает?

Строки хранятся в самом объекте Graph View, который должен быть постоянным, поскольку он является хранимой переменной в моей деятельности.

Я использую эти два метода для переключения файлов макета одним нажатием кнопки.

public class GraphLibActivity extends Activity {

    private Graph graph;

    private boolean editView;

    private static TextView coordTextView;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        editView = true;

        setContentView(R.layout.graphlib);



        graph = (Graph) findViewById(R.id.graph);

        coordTextView = (TextView)findViewById(R.id.currentCoords);


        (lots of calculations)
        graph.addLine(gelHistogramPoints, linePaint);



        graph.invalidate();      
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        if(editView == true){
            inflater.inflate(R.menu.activity_menu, menu);
        }else{
            inflater.inflate(R.menu.detailed_view_menu, menu);
        }
        return true;
    }

    public boolean onPrepareOptionsMenu(Menu menu){
        menu.clear();
        MenuInflater inflater = getMenuInflater();
        if(editView == true){
            inflater.inflate(R.menu.activity_menu, menu);
        }else{
            inflater.inflate(R.menu.detailed_view_menu, menu);
        }
        graph.invalidate();
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle item selection
        switch (item.getItemId()) {


        case R.id.detailed_view:
            editView = false;
            setContentView(R.layout.imagegraph);
            return true;


        case R.id.edit_view:
            editView = true;
            setContentView(R.layout.editgraph);             
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }

    }




}

Ответы [ 3 ]

25 голосов
/ 11 августа 2011

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

В любом случае, я бы порекомендовал объединить два макета в один файл. Затем используйте ViewFlipper для переключения с одного макета на другой. Это будет выглядеть примерно так:

graph.xml:

<ViewFlipper android:id="@+id/viewFlipper">
    <LinearLayout>
        // Here would go the content of R.layout.imagegraph
    </LinearLayout>
    <LinearLayout>
        // Here would go the content of R.layout.editgraph
    </LinearLayout>
</ViewFlipper>

Тогда вам просто нужно позвонить showNext(), чтобы переключить раскладки в своей деятельности:

ViewFlipper vf = (ViewFlipper) findViewById( R.id.viewFlipper );
vf.showNext();

Надеюсь, это поможет.

5 голосов
/ 11 августа 2011

Почему вы всегда раздуваете макет?Это действительно дорого.Попробуйте использовать макет слияния.Таким образом, вы можете изменить видимость на «Унесенные» или «Видимые».увидеть больше: http://android -developers.blogspot.com / 2009/03 / android-layout-tricks-3-optimize-by.html

0 голосов
/ 11 августа 2011

Я делаю нечто подобное для приложения, над которым работаю.

Простой способ решить эту проблему - установить видимость по умолчанию для второго представления на android:visibility="GONE" в XML, а затем идентифицировать каждое представление в коде. Затем вы можете установить видимость с помощью view1.setVisibility(View.GONE) и view2.setVisibility(View.VISIBLE)

Надеюсь, это поможет! Это прекрасно сработало для меня:)

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