Android:单击按钮时默认选项卡式活动不会启动
Posted
技术标签:
【中文标题】Android:单击按钮时默认选项卡式活动不会启动【英文标题】:Android: Default Tabbed Activity wont start when button is clicked 【发布时间】:2017-01-08 08:41:22 【问题描述】:我知道这已经被问了很多,已经对这个特定的主题进行了搜索。并且它们都返回相同的答案但不能解决我的问题,我在单独的 xml 上创建了一个按钮,用作片段。 TabbedActivity
只是不会启动,单击按钮时应用程序崩溃,甚至在使用的第一个代码上抛出 NPE。只是不知道该怎么办。
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//Set HomeFragment as user starts the app.
if (savedInstanceState == null)
InitStartFrag();
//-----BUG!-----//
1st:Code Used
android.support.v7.widget.AppCompatButton myButton = (android.support.v7.widget.AppCompatButton)findViewById(R.id.myButton);
myButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(MainActivity.this, TabbedActivity.class);
startActivity(intent);
);
2nd Code:
public void doThis(View view)
Intent intent = new Intent(this, TabbedActivity.class);
MainActivity.this.startActivity(intent);
3rd Code:
public void doThis(View view)
setContentView(R.layout.activity_tabbed);
//-----Bug Ends-----//
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
private void InitStartFrag()
android.app.FragmentManager fragmentManager = getFragmentManager();
android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
.....
.....
原木猫:
Process: com.my_app.app_one, PID: 3799
java.lang.IllegalStateException: Could not find a method doThis(View) in the activity class android.support.v7.widget.TintContextWrapper for onClick handler on view class android.support.v7.widget.AppCompatButton with id 'myButton'
at android.view.View$1.onClick(View.java:3843)
at android.view.View.performClick(View.java:4471)
at android.view.View$PerformClick.run(View.java:18778)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5324)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoSuchMethodException: doThis [class android.view.View]
at java.lang.Class.getConstructorOrMethod(Class.java:472)
at java.lang.Class.getMethod(Class.java:864)
at android.view.View$1.onClick(View.java:3836)
at android.view.View.performClick(View.java:4471)
at android.view.View$PerformClick.run(View.java:18778)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5324)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my_app.app_one">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".TabbedActivity"
android:label="@string/title_activity_tabbed"
android:parentActivityName=".MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.my_app.app_one.MainActivity" />
</activity>
</application>
</manifest>
XML,用作片段:buttons_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_>
<!--Upper Buttons-->
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:text="Fire"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn1"
android:textColor="@color/colorBtnText1"
android:drawableStart="@drawable/fire_icon"
android:drawablePadding="-62dip"
android:paddingLeft="30dip"
android:paddingRight="26dip"
android:singleLine="true"
android:gravity="center"
android:onClick="doThis"/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton1"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_below="@id/myButton"
android:text="Flood"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn3"
android:textColor="@color/colorBtnText3"/>
<!-- Divider -->
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton2"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_toEndOf="@id/myButton1"
android:text="Thunder"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn2"
android:textColor="@color/colorBtnText2"/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton4"
android:layout_
android:layout_
android:layout_below="@id/myButton2"
android:layout_gravity="center_horizontal"
android:layout_toEndOf="@id/myButton1"
android:text="Civil Defense Operation Center"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn4"
android:textColor="@color/colorBtnText4"/>
<!--Lower Buttons-->
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton5"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_below="@id/myButton3"
android:text="Landslide"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn5"
android:textColor="@color/colorBtnText5"/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton7"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_below="@id/myButton5"
android:text="Women and Children Protection Center"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn7"
android:textColor="@color/colorBtnText7"/>
<!-- Divider -->
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton6"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_below="@id/myButton4"
android:layout_toEndOf="@id/myButton3"
android:text="Storm"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn6"
android:textColor="@color/colorBtnText6"/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/myButton8"
android:layout_
android:layout_
android:layout_below="@id/myButton6"
android:layout_gravity="center_horizontal"
android:layout_toEndOf="@id/myButton5"
android:text="Earthquake"
android:textSize="15sp"
app:layout_heightPercent="25%"
app:layout_widthPercent="50%"
app:backgroundTint="@color/colorBtn8"
android:textColor="@color/colorBtnText8"/>
</android.support.percent.PercentRelativeLayout>
</LinearLayout>
使用的新代码:
private void InitBtnListener()
LayoutInflater layoutInflater = this.getLayoutInflater();
View view = layoutInflater.inflate(R.layout.buttons_layout,null);
android.support.v7.widget.AppCompatButton myButton = (android.support.v7.widget.AppCompatButton)view.findViewById(R.id.myButton);
myButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent(MainActivity.this, TabbedActivity.class);
startActivity(intent);
);
TabbedFragment.java 代码
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
public class TabbedFragment extends Fragment implements OnClickListener
View myView;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setRetainInstance(true);
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
myView = inflater.inflate(R.layout.survival_tips_layout,container,false);
android.support.v7.widget.AppCompatButton myButton = (android.support.v7.widget.AppCompatButton)myView.findViewById(R.id.myButton);
myButton.setOnClickListener(this);
return myView;
@Override
public void onClick(View view)
switch (view.getId())
case R.id.myButton:
//--Missing Code:--//
After Btn Click Fire up that TabbedActivity.
//--Ends--//
// Can I do intents Here?
Intent intent = new Intent(MainActivity.this,TabbedActivity.class);
startActivity(intent);
break;
【问题讨论】:
Caused by: java.lang.NoSuchMethodException: doThis [class android.view.View]
这不是 NPE。 不要在一个问题中混合不同的代码和错误。
对不起,你能帮帮我吗,我该怎么办?
选择一个有错误的代码并发布关于该对的问题。并获得相关的帮助。
【参考方案1】:
此行需要高于任何findViewById
setContentView(R.layout.activity_main);
如果 android:onClick
是从 XML 定义的,则需要一个 public
方法来接受具有该名称的 View
参数。
比如android:onClick="doThis"
表示你需要这个方法
public void doThis(View view)
// TODO: Handle click
我在单独的 xml 上创建了一个按钮,用作片段
然后你需要从Fragment
类中找到那个按钮。您无法从 Activity 中找到它。
例如
public class MyFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
// Inflate the layout
View rootView = inflater.inflate(R.layoutbuttons_layout, parentViewGroup, false);
Button button = (Button) rootView.findViewById(R.id.button);
// TODO: button.setOnClickListener();
return rootView;
// OR... if you have android:onclick="doThis"
public void doThis(View view)
// TODO: Handle click
【讨论】:
谢谢,我确实从 xml 中定义了它。我还从 MainActivity.java 创建了那个单独的函数。当它调用该函数时,我只是不知道要放什么确切的代码。注意使用的第二个代码。这是一个合适的方法吗? 这取决于按钮所在的 XML。但是,如果该方法不在另一个方法中,那是正确的方法。 “使用的第一个代码”是我推荐的方法,但同样,您必须先设置活动的内容视图,然后才能找到按钮。请edit
您的问题以显示该按钮包含在哪个 XML 文件中
老兄,我目前正在使用第二个代码。当我单击按钮时,应用程序崩溃。难道我做错了什么?该函数在 MainActivity.java 中独立存在
是的,1) 你的第二个代码块显示在 onCreate
方法中,所以它不应该编译。但是,让我们假设它实际上不是您在问题中放置的位置... 2) setContentView(R.layout.activity_main);
意味着无论您使用 findViewById
表示 必须在 activitiy_main.xml
中,但是您已显示您的 XML 名为 buttons_layout.xml
,这是您未显示的 Fragment 类,并且 无法从 Activity 中找到该按钮,因此出现错误
谢谢老兄,我明白了,只是不知道如何执行它,所以我只是使用该函数将 setContentView(activity_main) 恢复为 (activity_tabbed) 然后将该 XML 转换为 doThis() 函数导航那个按钮然后设置监听器?如果有问题,请纠正我。以上是关于Android:单击按钮时默认选项卡式活动不会启动的主要内容,如果未能解决你的问题,请参考以下文章