0

私はAndroid向けの開発を始めたばかりなので、非常に基本的な質問があります。

基本的に、縦向きと横向きの 2 つの画面レイアウトがあります。res/layout および res/layout-land フォルダーを使用します。どちらの向きもうまく描画されますが、向きごとに異なるウィジェット (ボタン)、btnPortrait と btnLandscape があります。

onSetClickListener() を呼び出そうとすると問題が発生します。デバイスが縦向きの場合、フレームワークは btnLandscape を見つけることができず、その逆も同様であるため、onConfigurationChange() を使用して向きの変更を手動で処理します。それもうまくいかないようです。

私のコード:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnPortrait = (Button) findViewById(R.id.portraitButton);
    tvPortrait = (TextView) findViewById(R.id.portraitText);
    btnLandscape = (Button) findViewById(R.id.landscapeButton);
    tvLandscape = (TextView) findViewById(R.id.landscapeText);
}

そして onConfigurationChange():

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        btnPortrait.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                    Toast.makeText(getContext(), "Portrait",Toast.LENGTH_SHORT).show();
            }
        });
    }

    else {
        btnLandscape.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "Landscape", Toast.LENGTH_SHORT).show();
            }
        });
    }   
}

トーストはどれも機能しません。誰かが何が起こっているのか知っていますか?

前もって感謝します。

4

3 に答える 3

1

別の名前を付けないでください。同じ機能のウィジェットは、縦向きでも横向きでも同じ ID を共有する必要があります。

ランドスケープでのみ存在するか、機能が異なるウィジェットである場合は、findViewById() の後で null かどうかを確認してください。null が返された場合は、そのボタンを含むレイアウトの構成に含まれていないことがわかります。

于 2013-07-15T18:51:44.633 に答える
0

「同じボタンではない」というコメントの意味がわかりませんが、2 つの異なるリソース ID で必要なことを行う方法は次のようになります...

public class MyActivity extends Activity {

    Button myButton = null;
    TextView myTextView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myButton = (Button) findViewById(R.id.portraitButton);
        if (myButton == null)
            myButton = (Button) findViewById(R.id.landscapeButton);
        myTextView = (TextView) findViewById(R.id.portraitText);
        if (myTextView == null)
            myTextView = (TextView) findViewById(R.id.landscapeText);
    }

    // The following method is your OnClickListener
    public void sayHello(View v) {
        switch (v.getId) {
            case R.id.portraitButton :
                // Do something for portrait
                break;
            case R.id.landscapeButton :
                // Do something for landscape
                break;
        }
    }
}

レイアウト ファイルでは、次のようにOnClickListenerusingandroid:onClickを割り当てます...

ポートレートに…

<Button
    android:id="@+id/portraitButton"
    ...
    android:onClick="sayHello" >
</Button>

風景に...

<Button
    android:id="@+id/landscapeButton"
    ...
    android:onClick="sayHello" >
</Button>

このように、が呼び出されたOnClickListenerときにインフレ プロセスによって が設定されます。setContentView(...)次に、実行する必要があるアクションを決定するために、リソース ID を決定するだけです。

于 2013-07-15T19:51:23.923 に答える