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:单击按钮时默认选项卡式活动不会启动的主要内容,如果未能解决你的问题,请参考以下文章

更改 android 标签上的按钮文本滑动或选择

如何在使用片段和计时器的选项卡式活动上更新 UI

有没有办法让选项卡式 pdf 显示在 Edge 中工作?

Android,完成所有活动

Android 选项卡式活动通过 volley 添加新片段

Android 应用程序 - 单击按钮不会打开新活动