Android:OnClickListener 在初始加载时无响应?

Posted

技术标签:

【中文标题】Android:OnClickListener 在初始加载时无响应?【英文标题】:Android: OnClickListener unresponsive on Initial Load? 【发布时间】:2016-10-24 19:56:34 【问题描述】:

我遇到了一个奇怪的问题,我不确定是什么原因造成的。基本上,我使用ErrorFragment 类来显示错误,简单吧?

问题与使用setButtonClickListener 设置按钮单击侦听器有关。最初加载 MainFragment 时,该按钮不会向我的 android TV 遥控器注册任何点击。

但是,如果我使用遥控器上的后退按钮重新加载 MainFragment,则该按钮会记录点击次数。

谁能告诉我为什么会发生这种情况?

谢谢!

MainActivity.java:

public class MainActivity extends Activity

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

activity_main.xml:

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_browse_fragment"
    android:name="com.ui.MainFragment"
    android:layout_
    android:layout_
    tools:context="com.ui.MainActivity"
    tools:deviceIds="tv"
    tools:ignore="MergeRootFrame" />

MainFragment.java:

public class MainFragment extends DetailsFragment

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    
        super.onActivityCreated(savedInstanceState);

        setupUIElements();

        if (isConnectingToInternet() == true)
        
            prepareBackgroundManager();
            loadRows();
            setupEventListeners();
        
        else
        
            InternetConnectivityFragment internetError = new InternetConnectivityFragment();

            getFragmentManager().beginTransaction().add(R.id.main_browse_fragment, internetError).commit();
        
    

    public class GetInternetStatus extends AsyncTask<Void,Void,Boolean>
    

        @Override
        protected Boolean doInBackground(Void... params)
        

            return hasInternetAccess();
        

        protected boolean hasInternetAccess()
        
            try
            
                URL url = new URL("http://www.google.com");

                HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                urlc.setRequestProperty("User-Agent", "Android Application:1");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1000 * 30);
                urlc.connect();

                // http://www.w3.org/Protocols/HTTP/HTRESP.html
                if (urlc.getResponseCode() == 200 || urlc.getResponseCode() > 400)
                
                    // Requested site is available
                    return true;
                
            
            catch (Exception ex)
            
                // Error while trying to connect
                ex.printStackTrace();
                return false;
            
            return false;
        
    

    // Checking for all possible internet connections
    public  boolean isConnectingToInternet()
    
        Boolean result = false;

        try
        
            //get the result after executing AsyncTask
            result = new GetInternetStatus().execute().get();
        
        catch (InterruptedException e)
        
            e.printStackTrace();
        
        catch (ExecutionException e)
        
            e.printStackTrace();
        
        return result;
    

    ....

InternetConnectivityFragment.java:

public class InternetConnectivityFragment extends android.support.v17.leanback.app.ErrorFragment

    private static int TIMER_DELAY = 3000;
    private static final String TAG = "InternetFragment";
    private static final boolean TRANSLUCENT = true;

    @Override
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);

        setErrorContent();
    

    private void setErrorContent()
    
        setImageDrawable(getResources().getDrawable(R.drawable.lb_ic_sad_cloud, null));
        setMessage(getResources().getString(R.string.no_internet_message));
        setDefaultBackground(TRANSLUCENT);

        setButtonText(getResources().getString(R.string.retry_connection));

        setButtonClickListener(new View.OnClickListener()
        
            @Override
            public void onClick(View arg0)
            
                MainFragment mainFragment = new MainFragment();

                if (mainFragment.isOnline() == true)
                
                    getFragmentManager().beginTransaction().remove(InternetConnectivityFragment.this).commit();
                    getFragmentManager().popBackStack();
                
            
        );
    


【问题讨论】:

你能把你的 loadRows 方法放进去吗?也许是这个原因。 这不是问题 尝试使用 ChildFragmentManager,而不是使用 FragmentManager。实际上,如果您想在另一个片段中添加片段,那么您必须使用子片段管理器 【参考方案1】:

您有 android API 来检查网络连接。检查此Network Connectivity

不建议在方法isOnline() 中访问Process。至少在主线程中。点击监听器中的mainFragment.isOnline() 可能是原因。尝试将其注释掉。

【讨论】:

注释掉没有效果,我还是无法用遥控器注册按钮点击...我添加了截图 尝试同样的调试。需要时间或迷路的地方。

以上是关于Android:OnClickListener 在初始加载时无响应?的主要内容,如果未能解决你的问题,请参考以下文章

Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

Android onClickListener实现最佳实践

在 listview Android 1.6 中同时使用 onClickListener 和 onLongClickListener

Android:OnClickListener 在初始加载时无响应?

XML 中的 Android onClick 与 OnClickListener

尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”