0

xml レイアウトのみが機能し、 OnCreate 内のコードよりも優先されるのはなぜですか? イメージビューを表示/非表示にしようとしていますが、レイアウトだけがそれを行うことができます.理由はわかりますか?

これは、次のような線形の垂直方向のレイアウトです。

<ImageView
        android:id="@+id/friendsButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:src="@drawable/friends_button" />

xml 全体:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/welcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="86dp"
                android:layout_marginTop="10dp"
                android:orientation="vertical"
                >

           <TextView
        android:id="@+id/textRequest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />



        <ImageView
            android:id="@+id/playButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/play_button" />

        <ImageView
            android:id="@+id/friendsButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="visible"
            android:src="@drawable/friends_button" />

     </LinearLayout>

</RelativeLayout>

そしてfriendsButton.setVisibility(View.INVISIBLE);_OnCreate

レイアウトでは非表示に、コードでは可視にしようとしましたが、それでもレイアウトと同じ優先度です...

何か案が?

ありがとう


編集 :


だから、これは私の活動の OnCreate メソッドです:

public class MainActivity extends Activity {

    private UiLifecycleHelper fbUiLifecycleHelper;
    private ImageView playButton;
    private ImageView friendsButton;
    private TextView textRequest; 
    // Parameters of a WebDialog that should be displayed
    private WebDialog dialog = null;
    private String dialogAction = null;
    private Bundle dialogParams = null;
    LayoutInflater inflater;
    private boolean gameLaunchedFromDeepLinking = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final LayoutInflater factory = getLayoutInflater();
        final View v = factory.inflate(R.layout.activity_main, null);
        textRequest = (TextView)v.findViewById(R.id.textRequest);
        playButton = (ImageView)v.findViewById(R.id.playButton);
        playButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                onPlayButtonTouched();
                return false;
            }
        });
        friendsButton = (ImageView)v.findViewById(R.id.friendsButton);
        friendsButton.setVisibility(View.INVISIBLE);
        friendsButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                onFriendsButtonTouched();
                return false;
            }
        });
4

1 に答える 1

1

表示されている動作は、onCreate()設定方法によるものです。

setContentView(R.layout.activity_main);

final LayoutInflater factory = getLayoutInflater();
final View v = factory.inflate(R.layout.activity_main, null);

setContentView(int)呼び出されると、R.layout.activity_mainが膨張し、アクティビティのビューが設定されます。

R.layout.activity_main これに続いて、再び膨らませています:

final LayoutInflater factory = getLayoutInflater();
final View v = factory.inflate(R.layout.activity_main, null);

ビューvは、 によってすでに設定されているビューと同じではありませんsetContentView(R.layout.activity_main, null)。次に、 を使用してvコンポーネントを初期化します。

textRequest = (TextView)v.findViewById(R.id.textRequest);

playButton = (ImageView)v.findViewById(R.id.playButton);

friendsButton = (ImageView)v.findViewById(R.id.friendsButton);

繰り返しますが、これらのウィジェットは、アクティビティで表示されるウィジェットには対応していません。したがって、次のようにすると:

friendsButton.setVisibility(View.INVISIBLE);

アクティビティ ビューには何もしません。

ここで問題を理解していただければ幸いです。では、解決へ。これを修正するには、次の 2 つの方法があります。

  • によって設定されたビューでウィジェットを検索setContentView(R.layout.activity_main):

削除する:

final LayoutInflater factory = getLayoutInflater();
final View v = factory.inflate(R.layout.activity_main, null);

使用する:

setContentView(R.layout.activity_main);

// Notice, we're not using v.findViewById(....)
textRequest = (TextView) findViewById(R.id.textRequest);
playButton = (ImageView) findViewById(R.id.playButton);

....
....    

friendsButton = (ImageView) findViewById(R.id.friendsButton);
friendsButton.setVisibility(View.INVISIBLE); // Will work now
  • setContentView(R.layout.activity_main)ビューが膨張するまで呼び出しを延期します。

コードをそのままにsetContentView(R.layout.activity_main);して、最初から削除します。すべてのウィジェットを設定したら配置します。

....
....
friendsButton.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        onFriendsButtonTouched();
        return false;
    }
});

// Use the inflated View `v`
setContentView(v);
于 2013-08-14T23:41:19.550 に答える