将动态TableLayout方法移动到单独的类

时间:2011-02-13 18:47:49

标签: android class tablelayout

我有一项活动需要对TableLayout进行各种条件更新(不显示具有'0'值的行,创建新的行项目等等)。我让Dynamic TableLayout运行得非常好,但是你可以想象这种情况的排列会继续增长。我想将各种TableRow管理方法移到一个单独的类中,但是在转换时遇到了问题。

第一个问题是当我尝试从我的主要活动中调用BuildTable.testTable();时,它希望该方法是静态的。这是有道理的但是当我使testTable变为静态时,我得到的抱怨是“无法从类型Activity中对非静态方法findViewById(int)进行静态引用”。当我遵循建议here时,我似乎非常接近解决方案,但它并没有完全融合在一起。我需要帮助......并且真诚地感谢你能提供的任何东西。

我已经将它简化为下面的基础知识,只插入了一个TextView ...我有:

public class BuildTable extends Activity {

public void  testTable() {
    TableLayout tl = (TableLayout)findViewById(R.id.InvoiceTable); // Find TableLayout defined in main.xml
        TableRow trDivider = new TableRow(getParent());
            TextView tvDivider = new TextView(getParent()); //Create a divider view between rows
            tvDivider.setText("test");
        trDivider.addView(tvDivider); //Add tvDivider to the new row
    tl.addView(trDivider); //Add trDivider to the TableLayout
}

3 个答案:

答案 0 :(得分:1)

  

第一个问题是我尝试的时候   调用BuildTable.testTable();从我的   它想要方法的主要活动   是静态的

为什么要静态调用此函数?

如果您只想分离某些功能,似乎没有必要实际扩展活动。将它称为非静态可能是一件事,并使用对您的活动的引用,如下所示:(快速打字,没有通过编译器运行它,看看我搞砸了我的语法:P)< / p>

public class BuildTable { //doesn't need activity
private Activity contextActivity; //here is your activity


public BuildTable(Activity yourContext){     //build a constructor
    contextActivity = yourContext;
}

public void  testTable() {
    TableLayout tl = (TableLayout)contextActivity.findViewById(R.id.InvoiceTable); 
        TableRow trDivider = new TableRow(getParent());
            TextView tvDivider = new TextView(getParent()); 
            tvDivider.setText("test");
        trDivider.addView(tvDivider); //Add tvDivider to the new row
    tl.addView(trDivider); //Add trDivider to the TableLayout
}

答案 1 :(得分:1)

如果您确实需要static方法,请将Activity传递给方法调用。

public class BuildTable {

    private BuildTable (){
        // private as no need to create an instance
    }

    public static void testTable(Activity contextActivity) {
        TableLayout tl = (TableLayout) contextActivity.findViewById(R.id.InvoiceTable); // Find TableLayout defined in main.xml
        // etc
    }
}

然后在Activity使用:

BuildTable.testTable(this);

答案 2 :(得分:0)

它要求该方法是静态的,因为您通过其类BuildTable.testTable()调用它;如果你要创建一个BuildTbale类的实例,那么它就不必是静态的。

因此,在您的主要活动中,您会说

BuildTable bt = new BuildTable(); bt.testTable(本); .....

但是,在您的情况下,我认为您只需要创建一个方法而不是新类,除非您要从多个活动中调用它,或者您想要创建同一个类的多个实例。