2015-12-17 1 views
2

Я хочу добавить кнопку в один из моих действий (который отображает новостную статью), поэтому, когда пользователь нажимает кнопку, статья открывается в браузере. До сих пор я добавил кнопку в свой xml, и она появляется. У меня просто возникают проблемы с прослушивателем кликов. Ниже мой код, я получаю сообщение об ошибке «setOnClickListener», который является «Нестационарным методом» setOnClickListener (android.view.View.onClickListener), на который нельзя ссылаться из статического содержимого.Добавление кнопки в действие, которая открывает URL-адрес браузера

Я не уверен, что это значит! возможно, я не вызываю метод в нужном месте или есть ошибка с самим методом?

Пожалуйста, может кто-то взглянуть, спасибо!

import android.content.Intent; 
import android.media.Image; 
import android.net.Uri; 
import android.support.v4.app.ShareCompat; 
import android.support.v4.view.MenuItemCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.ShareActionProvider; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 

import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.JsonArrayRequest; 
import com.android.volley.toolbox.JsonObjectRequest; 
import com.android.volley.toolbox.NetworkImageView; 

import org.json.JSONException; 
import org.json.JSONObject; 
public class NewsItemActivity extends AppCompatActivity { 

    //Declare java object for the UI elements 
    private TextView itemTitle; 
    private TextView itemDate; 
    private TextView itemContent; 
    private NetworkImageView itemImage; 

    private ShareActionProvider mShareActionProvider; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_news_item); 

     itemTitle = (TextView) findViewById(R.id.itemTitle); 
     itemDate = (TextView) findViewById(R.id.itemDate); 
     itemContent = (TextView) findViewById(R.id.itemContent); 
     itemImage = (NetworkImageView) findViewById(R.id.itemImage); 

     EDANewsApp app = EDANewsApp.getInstance(); 

     Intent intent = getIntent(); 
     int itemId = intent.getIntExtra("newsItemId", 0); 

     String url = "http://www.efstratiou.info/projects/newsfeed/getItem.php?id="+itemId; 

     JsonObjectRequest request = new JsonObjectRequest(url, listener, errorListener); 

     app.requestQueue.add(request); 

     Button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = getIntent(); 
       int itemId = intent.getIntExtra("newsItemId", 0); 
       String shareUrl = "http://www.efstratiou.info/projects/newsfeed/getItem.php?id=" + itemId; 

       Intent buttonIntent = new Intent(); 
       buttonIntent.setAction(Intent.ACTION_VIEW); 
       buttonIntent.addCategory(Intent.CATEGORY_BROWSABLE); 
       buttonIntent.setData(Uri.parse(shareUrl)); 
       startActivity(buttonIntent); 
      } 
     }); 
    }; 

activity_news_item.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" 
    tools:context=".NewsItemActivity"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/itemTitle" 
       android:layout_margin="15dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="20sp" 
       android:textStyle="bold" 
       android:textColor="#3183b9"/> 

      <TextView 
       android:id="@+id/itemDate" 
       android:layout_marginLeft="15dp" 
       android:layout_marginBottom="15dp" 
       android:textSize="16sp" 
       android:textStyle="italic" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       /> 

      <com.android.volley.toolbox.NetworkImageView 
       android:id="@+id/itemImage" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       /> 

      <TextView 
       android:id="@+id/itemContent" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="20sp" 
       android:textSize="16sp" 
       /> 

      <Button 
       android:id="@+id/BrowserButton" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="View in browser" 
       android:layout_marginLeft="15dp" 
       style="@style/BrowserButton" 
       /> 

     </LinearLayout> 
    </ScrollView> 

</RelativeLayout> 

ответ

5

Изменить

Button.setOnClickListener(new View.OnClickListener() { ... }); 

в

Button button = (Button) findViewById(R.id.BrowserButton); 
button.setOnClickListener(new View.OnClickListener() { ... }); 

Вам нужно вызвать метод setOnClickListener на примере Button, а не на самого класса.

+1

Спасибо так много! – user3005003

+0

Он должен создать объект 'Button' из' onCreate() 'он может вызвать NPE, если он хочет его использовать где-то ... :) –

+0

Привет, извините, я действительно не понимаю, что это значит? – user3005003

1

Проблема заключается в следующем:

Button.setOnClickListener(new View.OnClickListener() { 

Вы должны объявить его из onCreate(), как вы сделали с вашей как:

Button btn; 

Почему?

Потому что, если вы поместите его на onCreate() вы не сможете использовать этот объект из onCreate() поэтому рекомендуется под поставить его в качестве государственного объекта.

Затем в onCreate() сделать это:

btn = (Button)findViewById(R.id.BrowserButton); 

Тогда вы делаете OnclickListener() следующим образом:

btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent intent = getIntent(); 
      int itemId = intent.getIntExtra("newsItemId", 0); 
      String shareUrl = "http://www.efstratiou.info/projects/newsfeed/getItem.php?id=" + itemId; 

      Intent buttonIntent = new Intent(); 
      buttonIntent.setAction(Intent.ACTION_VIEW); 
      buttonIntent.addCategory(Intent.CATEGORY_BROWSABLE); 
      buttonIntent.setData(Uri.parse(shareUrl)); 
      startActivity(buttonIntent); 
     } 
    }); 

Я все еще получаю ошибку для onClickListener, мотивировав это «не может решить символ'.

Убедитесь, что вы импортировали это:

import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

Вы можете сделать это это делает:

Добавить implements OnClickListener { следующим образом:

public class NewsItemActivity extends AppCompatActivity implements View.OnClickListener { 

Тогда на вашем Button вас сделайте это:

btn = (Button)findViewById(R.id.BrowserButton); 
btn.setOnClickListener(this); 

Затем добавьте switch case следующим образом:

public void onClick(View v) { 
switch(v.getId()) { 
    case R.id.BrowserButton:   
     Intent intent = getIntent(); 
      int itemId = intent.getIntExtra("newsItemId", 0); 
      String shareUrl = "http://www.efstratiou.info/projects/newsfeed/getItem.php?id=" + itemId; 

      Intent buttonIntent = new Intent(); 
      buttonIntent.setAction(Intent.ACTION_VIEW); 
      buttonIntent.addCategory(Intent.CATEGORY_BROWSABLE); 
      buttonIntent.setData(Uri.parse(shareUrl)); 
      startActivity(buttonIntent); 
     } 
     break; 

} 

}

+0

Спасибо, это действительно полезно, и объяснение было полезным. Я все еще получаю сообщение об ошибке для onClickListener, говоря, что он не может разрешить символ. – user3005003

+0

Вы импортировали 'import android.view.View.OnClickListener;'? –

+0

Когда я это делаю, это не используется – user3005003

Смежные вопросы