【问题标题】:Switching between 2 layouts in android activity在android活动中的2个布局之间切换
【发布时间】:2011-08-10 20:35:02
【问题描述】:

我有 2 个不同的布局文件要用于修改相同的数据,我要切换到“编辑视图”的布局,允许用户修改图形数据,然后允许他们切换回显示详细图表的“详细视图”(使用 androidplot 库)。

我的问题是,当切换回我的“编辑视图”时,我的图形线消失了,只有轴绘制(因此布局切换和 onDraw() 正在为我的图形视图调用)。一切都存储在同一个 Activity 中,所以我不明白为什么这不起作用?

这些线条存储在 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);
        }

    }




}

【问题讨论】:

    标签: java android android-layout


    【解决方案1】:

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

    希望对你有帮助。

    【讨论】:

    • 我想显示特定视图而不用猜测您是在 next 还是 first 视图使用:vf.setDisplayedChild(vf.indexOfChild(vfChildView))
    • 在您的示例中,您还需要重置所有数据吗?如果两个布局中都有 textEdit,并且我想合并来自两个布局的信息,并将其放在第三种布局的 textView 中,我该怎么做?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我正在为我正在开发的应用程序做类似的事情。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多