【问题标题】:textview getting pushed off into the screentextview 被推到屏幕上
【发布时间】:2017-03-07 13:42:53
【问题描述】:

我在处理动态生成的表格布局中的文本视图时遇到了问题(显示为存折语句)。在这里,我使用了两个表格布局,一个作为固定标题,另一个作为可滚动的。我正在使用屏幕宽度概念为每个文本视图分配一定百分比的屏幕宽度。

screenWidth = getResources().getDisplayMetrics().widthPixels;

文本视图进入屏幕的主要问题,如屏幕截图所示。

在这方面寻求您的帮助。谢谢你的帮助!!

XML 布局

   <ScrollView
    android:id="@+id/ScrollView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_below="@id/spinner1"
    android:layout_marginTop="45dp">
      <TableLayout
        android:id="@+id/tbl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"   
        android:text='ewe'   
        android:layout_below="@id/ScrollView1" >       
      </TableLayout>
    </ScrollView>

   <TableLayout
    android:id="@+id/tablelayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/ScrollView1"
    android:layout_marginTop="-20dp"
    android:gravity="left">
  </TableLayout> 

Java 类

                    TableLayout t2 = (TableLayout) findViewById(R.id.tbl);

        // t4 header fixed
        TableLayout t4 = (TableLayout) findViewById(R.id.tablelayout);
        t4.removeAllViews();
        TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(
                TableLayout.LayoutParams.MATCH_PARENT,
                TableLayout.LayoutParams.WRAP_CONTENT);         
        TableRow tr_head = new TableRow(this);
        tr_head.setId(10);
        tr_head.setBackgroundColor(Color.WHITE);
        android.widget.TableRow.LayoutParams trlp = new TableRow.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);          
        tr_head.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        TextView label_dateval = new TextView(this);
        label_dateval.setId(20);
        label_dateval.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
        label_dateval.setText("TxnDate");
        label_dateval.setClickable(true);
        label_dateval.setWidth(20* screenWidth / 100);

        label_dateval.setTypeface(Typeface.DEFAULT_BOLD);   
        label_dateval.setPadding(15, 0, 5, 0);          
        tr_head.addView(label_dateval);// add the column to the table row
                                        // here

        TextView label_narr = new TextView(this);
        label_narr.setId(21);// define id that must be unique
        label_narr.setText("DatVal"); // set the text for the header
        label_narr.setWidth(20 * screenWidth / 100);
        //label_narr.setLayoutParams(trlp);     
        label_narr.setPadding(5, 0, 5, 0);      
        label_narr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
        label_narr.setTypeface(Typeface.DEFAULT_BOLD);
        tr_head.addView(label_narr);

        TextView label_dr = new TextView(this);
        label_dr.setId(22);// define id that must be unique
        label_dr.setText("Narration");
        label_dr.setWidth(20 * screenWidth / 100);  
        //label_dr.setLayoutParams(trlp);
        label_dr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
        label_dr.setTypeface(Typeface.DEFAULT_BOLD);// set the color
        label_dr.setPadding(5, 0, 5, 0);     // set the padding (if required)
        tr_head.addView(label_dr);

        TextView label_cr = new TextView(this);
        label_cr.setId(22);// define id that must be unique
        label_cr.setText("DR."); // set the text for the header
        label_cr.setWidth(20 * screenWidth / 100);          
        label_cr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
        label_cr.setTypeface(Typeface.DEFAULT_BOLD);// set the color
        label_cr.setPadding(5, 0, 5, 0);    
        tr_head.addView(label_cr);

        TextView label_runbal = new TextView(this);
        label_runbal.setId(22);// define id that must be unique
        label_runbal.setText("CR."); // set the text for the header
        label_runbal.setWidth(20 * screenWidth / 100);
        //label_runbal.setLayoutParams(trlp);
        label_runbal.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
        label_runbal.setTypeface(Typeface.DEFAULT_BOLD);// set the color            
        label_runbal.setPadding(5, 0, 5, 0);    

        tr_head.addView(label_runbal);
        t4.addView(tr_head, new TableLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));



        int rowCount = DATPost.length;
        Log.d("Fill Table", "rowCount = " + rowCount);          
        for (int k = 0; k < rowCount; k++) {

            TableRow tr = new TableRow(this);               
            tr.setId(100 + count);
            tr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT));

            // Create two columns to add as table data
            // Create a TextView to add date
            TextView labelvalDate = new TextView(this);
            labelvalDate.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
            labelvalDate.setId(200 + count);
            labelvalDate.setWidth(20 * screenWidth / 100);              
            labelvalDate.setClickable(true);
            labelvalDate.setText(DATPost[k]);
            labelvalDate.setPadding(15, 0, 5, 0);
            labelvalDate.setTextColor(Color.BLACK);
            tr.addView(labelvalDate);

            TextView labelnarr = new TextView(this);
            labelnarr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
            labelnarr.setId(200 + count);
            labelnarr.setText(DatVal[k]);               
            labelnarr.setWidth(20 * screenWidth / 100);             
            labelnarr.setPadding(5, 0, 5, 0);               
            labelnarr.setTextColor(Color.BLACK);
            tr.addView(labelnarr);

            TextView labeldr = new TextView(this);
            labeldr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
            labeldr.setId(200 + count);
            labeldr.setWidth(20 * screenWidth / 100);               
            labeldr.setText(Narration[k]);              
            labeldr.setPadding(5, 0, 5, 0);
            labeldr.setTextColor(Color.BLACK);
            tr.addView(labeldr);

            TextView labelcr = new TextView(this);
            labelcr.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
            labelcr.setId(200 + count);
            labelcr.setText(Credit[k].trim());
            labelcr.setPadding(5, 0, 5, 0);
            labelcr.setWidth(20 * screenWidth / 100);               
            labelcr.setTextColor(Color.BLACK);
            tr.addView(labelcr);

            TextView Runnbal = new TextView(this);
            Runnbal.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
            Runnbal.setId(200 + count);
            Runnbal.setText(Debit[k]);
            Runnbal.setWidth(20 * screenWidth / 100);               
            Runnbal.setPadding(5, 0, 5, 0);
            Runnbal.setTextColor(Color.BLACK);
            Runnbal.setGravity(Gravity.CENTER_HORIZONTAL);
            tr.addView(Runnbal);                
            t2.addView(tr, new TableLayout.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        }

【问题讨论】:

  • label_dr.setWidth(20 * screenWidth / 100);用 label_dr.setWidth(15 * screenWidth / 100); 改变这一行;
  • 您的 label_dr 占用了太多空间。减少它然后尝试
  • 主要问题是您要划分 5 个标签,这很好。但你也给填充。这就是为什么你的最后一个标签要出去了。希望你明白这一点

标签: android textview tablelayout


【解决方案1】:

如果您想对每个 TextView 应用相同的宽度,那么我认为 layout_weight 会比宽度更合适。

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                                     0,
                                     LayoutParams.MATCH_PARENT,
                                     1.0f);
label_dr.setLayoutParams(param);

最后一个参数是权重。

而且我还建议您创建将创建 TextView 并返回的方法,这样您就不需要为每个 TextView 重复相同的代码。

一步一步的完整示例代码:

  1. MainActivity.java

    public class MainActivity extends AppCompatActivity
    {
        TableLayout tableLayout;
        private Button button;
        String[] DATPost={"03-AUG-2014","03-AUG-2014","03-AUG-2014","03-AUG-2014"};
        String[] DatVal={"31-AUG-2014","31-AUG-2014","31-AUG-2014","31-AUG-2014"};
        String[] Narration={"Principle","Interest","Interest","Interest"};
        String[] Credit={"0.00","0.00","0.00","0.00"};
        String[] Debit={"30","22","23","152"};
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    tableLayout=(TableLayout)findViewById(R.id.drawer_layout);
    addHeaderRow();
    addRows();
    
     }
    
     private void addHeaderRow()
     {
         TableRow tr = new TableRow(this);
         tr.setLayoutParams(new TableRow.LayoutParams(
            TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        TextView tvTxnDate = getTextView("TxnDate", -1,true,R.drawable.header_background);
    
        tr.addView(tvTxnDate);
    
        TextView tvDatVal = getTextView("DatVal", -1,true,R.drawable.header_background);
        tr.addView(tvDatVal);
    
        TextView tvNarration = getTextView("Narration", -1,true,R.drawable.header_background);
       tr.addView(tvNarration);
    
       TextView tvDebit = getTextView("DR.", -1,true,R.drawable.header_background);
       tr.addView(tvDebit);
    
       TextView tvCredit = getTextView("CR.", -1,true,R.drawable.header_background);
       tr.addView(tvCredit);
    
       tableLayout.addView(tr, new TableLayout.LayoutParams(
            TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    
       }
    
      private void addRows() {
    int count=200;
    for(int k=0;k<DATPost.length;k++) {
    
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new TableRow.LayoutParams(
                TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
    
        TextView labelvalDate = getTextView(DATPost[k], count,false,R.drawable.cell_background);
        labelvalDate.setClickable(true);
    
        tr.addView(labelvalDate);
    
        TextView labelnarr = getTextView(DatVal[k], count,false,R.drawable.cell_background);
        tr.addView(labelnarr);
    
        TextView labeldr = getTextView(Narration[k], count,false,R.drawable.cell_background);
        tr.addView(labeldr);
    
        TextView labelcr = getTextView(Credit[k].trim(), count,false,R.drawable.cell_background);
        tr.addView(labelcr);
    
        TextView Runnbal = getTextView(Debit[k], count,false,R.drawable.cell_background);
        tr.addView(Runnbal);
    
        tableLayout.addView(tr, new TableLayout.LayoutParams(
                TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    }
    }
    public TextView getTextView(String value, int count,boolean boldFlag,int background)
    {
           TextView textview = new TextView(this);
           textview.setLayoutParams(new TableRow.LayoutParams(
            0, TableRow.LayoutParams.WRAP_CONTENT,1.0f));
           textview.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
           if(count!=-1)
               textview.setId(200 + count);
           textview.setText(value);
           textview.setTextColor(Color.BLACK);
           if(boldFlag)
               textview.setTypeface(Typeface.DEFAULT_BOLD);
           textview.setBackgroundResource(background);
           return textview;
           }
    }
    
  2. activity_main.xml

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    

  3. 可绘制文件夹内的cell_background.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="#cebcbc" />
    <stroke android:width="1dip" android:color="#4fa5d5"/>
    

  4. 可绘制文件夹中的header_background.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="#e1ecbb" />
    <stroke android:width="1dip" android:color="#4fa5d5"/>
    

这是完整的工作示例代码,没有 TextView 推送...

两个表格布局

您只需要对两个 TableLayout 进行细微的更改。正如您在您提到的问题 t4 是您的标题 TableLayout 而 t2 是您的行 TableLayout 所以在我的代码里面 addHeaderRow() 方法

 private void addHeaderRow()
{
 ....
 ....

 t4.addView(tr, new TableLayout.LayoutParams(
    TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));

}

在 addRows() 方法中

private void addHeaderRow()
{
 ....
 ....

 t2.addView(tr, new TableLayout.LayoutParams(
    TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));

}

布局将与您实现的相同,其他代码也保持不变。

【讨论】:

  • 列本身正在消失
  • 它看起来好多了。让我试一试,然后回来。
  • 现在所有的列都消失了。我遗漏了什么或需要任何其他信息来检查问题?
  • 让我再试一次,然后回复你。
  • 很好,工作正常。但在我的情况下,它可能会失败并且仍然显示 addRows 部分的空列,因为我试图用来分隔 tablelayouts ,一个用于标题,一个用于行。这是因为我必须滚动行部分。如果我使用的是单个表格布局,那么您的代码工作正常,但不能滚动。
【解决方案2】:

如果您想要 5 个相等的标签,请删除您的填充。主要问题是填充。如果你想要填充,你需要根据它来改变你的标签宽度。

label_dr.setWidth(20 * screenWidth / 100);

改变这一行
label_dr.setWidth(15 * screenWidth / 100); 

如果你想要填充,你需要静态检查这个宽度。如果您想使用填充,则此问题出现在不同的设备上。

希望对你有帮助

【讨论】:

  • 比以前更好。但仍然没有完全解决问题。不过谢谢你的建议
  • 缩小cr标签和旁白的宽度。如果这有帮助,请将其标记为正确答案,以便其他人从中获得帮助。很高兴帮助你兄弟:) :)
  • 我的主要问题是最后一列,当我将重力赋予正确时。为什么将文本推送到屏幕上。
  • 如果您减小其他标签的宽度,那么最后一个标签会自动进入屏幕,请检查。减少其他标签的宽度。并将 cr 标签宽度减小到 10 或 15。@BasatiNaveen 请这样做
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多