在android活动中切换2个布局

时间:2011-08-10 20:35:02

标签: java android android-layout

我有两个不同的布局文件,我想用它来修改相同的数据,我是切换到我的布局为“编辑视图”,允许用户修改图形数据,然后允许他们切换回“详细视图”显示详细图表(使用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 个答案:

答案 0 :(得分:25)

每次调用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();

希望它有所帮助。

答案 1 :(得分:5)

为什么总是夸大布局?这真的很贵。尝试使用合并布局。这样,您可以将visibilty更改为“Gone”或“Visible”。 看到更多:http://android-developers.blogspot.com/2009/03/android-layout-tricks-3-optimize-by.html

答案 2 :(得分:0)

我正在为我正在处理的应用做类似的事情。

解决此问题的一种简单方法是在XML中将第二个视图的默认可见性设置为android:visibility="GONE",然后在代码中标识每个视图。然后,您可以使用view1.setVisibility(View.GONE)view2.setVisibility(View.VISIBLE)

设置可见性

希望这有帮助!它对我很有用:))