2015-06-19 146 views
0

我正在尝试使用触发声音的按钮编写应用程序,并希望按钮仅在按下时才可见。但是当我添加setVisibility方法时,它会崩溃我的应用程序。这里是我的XML代码:setVisibility(View.INVISIBLE)让我的应用程序崩溃

<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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" 
    android:id="@+id/background" 
    android:background="@drawable/image" 
    android:orientation="horizontal"> 

    <ImageButton 
     android:id="@+id/btn1" 
     android:layout_width="109dp" 
     android:layout_height="89dp" 
     android:scaleType="fitXY" 
     android:layout_marginTop="26dp" 
     android:src="@mipmap/oneeee" 
     android:background="@null" 
     android:contentDescription="@null" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="1dp" /> 

</RelativeLayout> 

还有java的部分:

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.RelativeLayout; 

import static android.view.View.VISIBLE; 

public class MainActivity extends Activity { 

    RelativeLayout background; 
    ImageButton btn; 
    MediaPlayer sound; 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     sound.release(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     btn.setVisibility(View.INVISIBLE); 
     setContentView(R.layout.activity_main); 
     sound = MediaPlayer.create(this, R.raw.kick); 
     btn = (ImageButton) findViewById(R.id.btn1); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.kick); 
       btn.setVisibility(View.VISIBLE); 
       mp.start(); 
      } 
     }); 
    } 

} 
+0

您在声明按钮之前设置了隐藏状态,放入btn.setVisibility(View.INVISIBLE); btn =(ImageButton)findViewById(R.id.btn1); – Santiago

回答

1

我猜你会得到一个NullPointerException。

这是因为您在将值分配给btn之前要调用btn.setVisibility()。所以btnnull

通常的做法是在super.onCreate之后执行setContentView(R.layout.<layout name>)。 ,并且在初始化它以引用实际的按钮视图之前,您正在设置btn的可见性。

建议改变:

btn = (Button) findViewById(R.id.xxx); 
btn.setVisibility(View.INVISIBLE); 
+0

现在当我按下按钮没有任何反应 – android

+0

你的日志中有什么? –

+0

不是真的 – android

2

setContentView这就是为什么它的崩溃setContentView后,可以请你打电话之前要调用btn.setVisibility(View.INVISIBLE);这个函数,那么它会不会崩溃

setContentView(R.layout.activity_main); 
btn = (ImageButton) findViewById(R.id.btn1); 
btn.setVisibility(View.INVISIBLE); 
+0

它仍会崩溃。因为btn仍然是NULL –

+0

现在检查上面的代码,那么它会为你工作 –

0

BTN参照空实例。

移动线

btn.setVisibility(View.INVISIBLE); 

btn = (ImageButton) findViewById(R.id.btn1); 
+0

现在什么时候按下按钮什么都没有发生 – android

0

你调用btn.setVisiblility你设置布局和检索按钮的ID之前。正确的方法应该是先设置布局,检索按钮ID,然后设置按钮的可见性。

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

sound = MediaPlayer.create(this, R.raw.kick); 
btn = (ImageButton) findViewById(R.id.btn1); 
btn.setVisibility(View.INVISIBLE); 
btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.kick); 
      btn.setVisibility(View.VISIBLE); 
     mp.start(); 

    } 
}); 
}