如何在Android中的活动之间传输一些值

时间:2015-09-29 06:11:27

标签: java android android-bundle

我尝试将当前活动的int值发送到新活动,这是当前活动中的部分。

            dialog.setPositiveButton("4 players", new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "Start a new game!", Toast.LENGTH_SHORT).show();
                    // need send extra value to PlayerBoardActivity to decide how many buttons I should have
                    Intent intent = new Intent(MainActivity.this,
                            PlayBoardActivity.class);
                    intent.putExtra(PLAYER_NO, 4);
                    startActivity(intent);
                }

            });
            dialog.setNegativeButton("2 players", new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "Start a new game!", Toast.LENGTH_SHORT).show();
                    // need send extra value to PlayerBoardActivity to decide how many buttons I should have
                    Intent intent = new Intent(MainActivity.this,
                            PlayBoardActivity.class);
                    intent.putExtra(PLAYER_NO, 2);
                    startActivity(intent);
                }

            });

问题是,我为新活动创建了2个布局文件。例如,当我按下对话框中的否定按钮时,我想要的是让新活动(在我的情况下是PlayerBoardActivity)加载与我发送的值相对应的布局文件“intent.putExtra(PLAYER_NO,2);”< / p>

新活动中的代码是

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final String PLAYER_NO = "the number of players";
    Bundle b = getIntent().getExtras();
    int a = b.getInt(PLAYER_NO);
    if (b != null) {
        if (a == 2) {
            setContentView(R.layout.two_player);
        }
        if(a == 4){
            setContentView(R.layout.four_player);
        }
    }
}

我想知道我是否可以这种方式加载不同的布局文件?或者是否有更好的解决方案来解决我的问题。

提前谢谢大家。

5 个答案:

答案 0 :(得分:1)

如果您使用

intent.putExtra(PLAYER_NO, 2);

你应该调用以下代码来获取值(不使用“Bundle”):

getIntent().getIntExtra(PLAYER_NO, -1)

答案 1 :(得分:1)

在您的代码中,问题出在您要调用的第二个活动中。 您试图以不正确的方式从意图中获取值。 在第二项活动中试试这个:

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   Intent intent = getIntent();
   int b = intent.getIntExtra(PLAYER_NO, 0);
        if (b == 2) {
            setContentView(R.layout.two_player);
        } 
        if(b == 4){
            setContentView(R.layout.four_player);
        } 
} 

答案 2 :(得分:0)

Ji Yang ......很好......如果布局内容同一种结构,并且在同一活动中处理任何布局的不同资源都不是那么困难。

假设布局two_player.xml是

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="6dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:orientation="vertical">

<TextView
    android:id="@+id/textview1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#777370"
    android:textSize="16sp"
    android:paddingLeft="5dp"
    android:text="Dummy Text"
    android:visibility="gone"
    android:textStyle="bold"/>
</RelativeLayout>

和布局four_player.xml就是这样的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="6dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:orientation="vertical">

<ImageView
    android:id="@+id/iv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/order_content"
    android:src="@drawable/order_next_sap"
    android:layout_alignLeft="@+id/order_content"/>
<ImageView
    android:id="@+id/iv2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/order_content"
    android:src="@drawable/order_next_sap"
    android:layout_alignLeft="@+id/order_content"/>
</RelativeLayout>

意味着...不同定义的布局......比同一活动中两种布局难以使用的资源一样,也不好......

在这种情况下,更好的解决方案是创建两个布局的片段

class TwoPlayerFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup   container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.two_player, container, false);
        return v;
    }
}

class FourPlayerFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup   container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.four_player, container, false);
        return v;
    }
}

并根据意图值从对话框传递使用片段。

答案 3 :(得分:0)

试试这个,

<a href='@Url.Action("action", "controller")'>

答案 4 :(得分:0)

你做得非常错误。你应该使用片段。您应该创建两个片段,您可以在其中扩展不同的不同布局。但这是你的电话。

从PlayBoardActivity发送数据,如:

intent.putExtra(PLAYER_NO, 4);

因此,在新活动中,您需要像以下一样进行检索:

int b=getIntent.getIntExtra(PLAYER_NO,defaulValue);

你试图从捆绑中获取错误的价值。