0

Androidでは、いくつかの値(文字列)を持つテーブルを作成しました。テーブル内の任意の値をクリックすると、同じ値が別のアクティビティに表示されます。

私は2つのアクティビティを作成しました。最初のアクティビティには、値を持つテーブル(テーブルレイアウトを使用)が含まれています(文字列値はすべてテキストビューです)。テーブル内の任意の値(つまりテキストビュー)をクリックすると、同じ値が2番目に表示されますactivity.I試しましたが、出力を取得できませんでした。可能ですか??

最初のアクティビティ:

public class Table_LayoutActivity extends Activity 

{

      TextView textview;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TableLayout table=(TableLayout)findViewById(R.id.tableLayout1);
        table.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View v) {

                        String value=((TextView)v).getText().toString();
                        Intent intent=new Intent(getApplicationContext(),Selected_Item_Activity.class);
                        intent.putExtra("value", value);
                        startActivity(intent);
                  }
            });
    }
}

2 番目のアクティビティ:

public class Selected_Item_Activity extends Activity 
{
                @Override
    public void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.selected_item);
        Intent intent=getIntent();
        String value=intent.getStringExtra("value");
        TextView text=(TextView)findViewById(R.id.tv);
        text.setText(value);

    }
}

java.lang.RuntimeException: Unable to 
start activity 
ComponentInfo{com.tablelayout/com.tablelayout.Selected_Item_Activity}:java.lang.RuntimeException: Binary XML file line #7: You must supply a layout_width attribute.
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)android.app.ActivityThread.access$2300(ActivityThread.java:125)android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)android.app.ActivityThread.main(ActivityThread.java:467)java.lang.reflect.Method.invokeNative(Native Method)java.lang.reflect.Method.invoke(Method.java:521)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.RuntimeException: Binary XML file line #7: You must supply a layout_width attribute.
android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:3592)android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:3672)android.widget.LinearLayout$LayoutParams.<init>(LinearLayout.java:1395)android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1321)android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:45)android.view.LayoutInflater.rInflate(LayoutInflater.java:620)android.view.LayoutInflater.inflate(LayoutInflater.java:407)android.view.LayoutInflater.inflate(LayoutInflater.java:320)android.view.LayoutInflater.inflate(LayoutInflater.java:276)
com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)android.app.Activity.setContentView(Activity.java:1647)
com.tablelayout.Selected_Item_Activity.onCreate(Selected_Item_Activity.java:12)android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
4

2 に答える 2

0

あなたのスニペットの問題は、実際にTableLayout自体があり、それをTextViewにキャストしようとしているので、使用String value=((TextView)v).getText().toString();すると取得されることです。ClassCastExceptionv


1) 1列のみのTableLayoutに適したソリューション


そこで、TableLayoutのセルから値を取得したいと思います。そのために、コンポーネント自体にonClickListenerを設定する必要はありませんが、次のように設定できます。

  • あなたのレイアウトのxml定義で(私はあなたが今そこに似たものを持っていると仮定します):

    <TableRow
            android:id="@+id/tableRow1"
            android:tag="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="rowClicked" >
    
    <TextView
            android:id="@+id/textView1"
            android:text="Row 1"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </TableRow>
    
    <TableRow
            android:id="@+id/tableRow2"
            android:tag="2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="rowClicked" >
    
        <TextView
                android:id="@+id/textView2"
                android:text="Row 2"
                android:textAppearance="?android:attr/textAppearanceLarge" />
    </TableRow>
    

ここでは、文字列とイベントであるすべてのTableRowtagにプロパティを設定します。これは、このレイアウトをコンテンツ ビューとして持つアクティビティでも設定できます。onClicksetOnClickListener(..)

  • 現在、コンテンツ ビューとしてこの ^^ xml レイアウトを持つアクティビティにあります (これは次のことを行います:
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.name_of_this^^_layout);

)、 TableRowコンポーネントrowClickedで行われたクリック イベントをインターセプトするメソッドを実装します。

public void rowClicked(View v){
            Intent intent = new Intent(getApplicationContext(), Selected_Item_Activity.class);
            intent.putExtra("value", ""+v.getTag());
            //or intent.putExtra("value", ""+((TextView)((TableRow)v).getChildAt(0)).getText());
            startActivity(intent);
}

2) 複数の列を持つ TableLayout に適したソリューション


  • レイアウトの xml 定義:

    <TableRow
            android:id="@+id/tableRow3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:tag="1">
    
        <TextView
                android:text="Column 1.1"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    
        <TextView
                android:text="Column 1.2"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    
        <TextView
                android:text="Column 1.3"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    </TableRow>
    
    <TableRow
            android:id="@+id/tableRow4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:tag="2">
    
        <TextView
                android:text="Column 2.1"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    
        <TextView
                android:text="Column 2.2"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
        <TextView
                android:text="Column 2.3"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    </TableRow>
    
    <TableRow
            android:id="@+id/tableRow5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:tag="3">
    
        <TextView
                android:text="Column 3.1"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    
        <TextView
                android:text="Column 3.2"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
        <TextView
                android:text="Column 3.3"
                android:textAppearance="?android:attr/textAppearanceLarge"/>
    </TableRow>
    

ここで、everyTableRowはタグを取得します。タグは 1 から開始し、行ごとにインクリメントする必要があります (このソリューションに基づく)

  • コンテンツ ビューとしてこの ^^ xml レイアウトを持つアクティビティに含まれています。
TableLayout table = (TableLayout) findViewById(R.id.tableLayout1);
TableRow row1 = (TableRow)findViewById(R.id.tableRow3);
TableRow row2 = (TableRow)findViewById(R.id.tableRow4);
TableRow row3 = (TableRow)findViewById(R.id.tableRow5);
row1.setOnTouchListener(this);
row2.setOnTouchListener(this);
row3.setOnTouchListener(this);
private boolean containsCoordinates(int index, View view, int rx, int ry) {
    int[] l = new int[2];
    view.getLocationOnScreen(l);
    int x = l[0];
    int y = l[1];
    int w = view.getWidth();
    int h = view.getHeight();

    if(new Rect(x, (y-h-(h*index)), (x+w), y).contains(rx, ry)){
        return true;
    }

    return false;
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    for (int i = 0; i < ((TableRow)view).getChildCount(); i++){
        if(containsCoordinates(Integer.parseInt(((TableRow)view).getTag().toString()), ((TableRow)view).getChildAt(i), (int)motionEvent.getX(), (int)motionEvent.getY())){
            Intent intent = new Intent(getApplicationContext(), Selected_Item_Activity.class);
            intent.putExtra("value", ""+((TextView)((TableRow)view).getChildAt(i)).getText());
            startActivity(intent);
            break;
        }
    }
    return false;
}

また、アクティビティで View.OnTouchListener を実装する必要があることを忘れないでください。

于 2013-06-27T07:51:11.983 に答える