ImageView setVisibility (0) и исключение нулевого указателя - PullRequest
1 голос
/ 16 февраля 2012

У меня есть 2 xml файлы, основной файл, где у меня есть listView, и другой, где я делаю некоторые настройки для моего listView. Второй xml используется на моем Custom ArrayAdapter.

Во втором xml у меня есть ImageView, который я хотел бы установить видимым в один момент, но я получаю null pointer exception, потому что я никогда не устанавливаю setCurrentView второй xml файл, где мой ImageView.

Я пытаюсь сделать это:

ImageView statusOk=(ImageView)findViewById(R.id.statusOkImage);
statusOk.setVisibility(0);

Не могли бы вы сказать мне, как решить эту проблему?

Спасибо.

Edit:

Вот еще код:

main.xml

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">

  <ListView
   android:id="@+id/ListView01"
   android:layout_height="wrap_content"
   android:layout_width="fill_parent"/>
</LinearLayout>

Второй xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

<ImageView
    android:id="@+id/statusOkImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/status_ok" 
    android:visibility="invisible"/>

  <TextView android:id="@+id/name"
  android:textSize="14sp"
  android:textStyle="bold"
  android:textColor="#FFFF00"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <TextView android:id="@+id/cityState"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <TextView android:id="@+id/phone"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity:

public class TestListActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ArrayList<SearchResults> searchResults = GetSearchResults();
    final ListView lv1 = (ListView) findViewById(R.id.ListView01);
    lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults));
}

private ArrayList<SearchResults> GetSearchResults(){
 ArrayList<SearchResults> results = new ArrayList<SearchResults>();

 SearchResults sr1 = new SearchResults();
 sr1 = new SearchResults();
 sr1.setName("Fred Jones");
 sr1.setCityState("Las Vegas, NV");
 sr1.setPhone("612-555-8214");
 results.add(sr1);
 return results;
}
}

Пользовательский адаптер:

public class MyCustomBaseAdapter extends BaseAdapter {
 private static ArrayList<SearchResults> searchArrayList;

 private LayoutInflater mInflater;

 public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
  searchArrayList = results;
  mInflater = LayoutInflater.from(context);
 }

 public int getCount() {
  return searchArrayList.size();
 }

 public Object getItem(int position) {
  return searchArrayList.get(position);
 }

 public long getItemId(int position) {
  return position;
 }

 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.custom_row_view, null);
   holder = new ViewHolder();
   holder.txtName = (TextView) convertView.findViewById(R.id.name);
   holder.txtCityState = (TextView) convertView.findViewById(R.id.cityState);
   holder.txtPhone = (TextView) convertView.findViewById(R.id.phone);


   convertView.setTag(holder);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }

  mInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

     View view=mInflater.inflate(R.layout.custom_row_view, null);

     ImageView statusOk=(ImageView)view.findViewById(R.id.imageView1);
        statusOk.setVisibility(View.VISIBLE);
  holder.txtName.setText(searchArrayList.get(position).getName());
  holder.txtCityState.setText(searchArrayList.get(position).getCityState());
  holder.txtPhone.setText(searchArrayList.get(position).getPhone());

  return convertView;
 }

 static class ViewHolder {
  TextView txtName;
  TextView txtCityState;
  TextView txtPhone;
 }
}

И, наконец, класс ресурсов для listView

public class SearchResults {
 private String name = "";
 private String cityState = "";
 private String phone = "";

 public void setName(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }

 public void setCityState(String cityState) {
  this.cityState = cityState;
 }

 public String getCityState() {
  return cityState;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

 public String getPhone() {
  return phone;
 }
}

Ответы [ 5 ]

4 голосов
/ 16 февраля 2012

Чтобы установить представление видимости, определенное в xml, вам нужно накачать это представление в действии, setContentView сделает это автоматически, и поскольку вы не вызываете setContentView для второго xml, используйте:

LayoutInflater inflater=(LayoutInflater)getSystemService(Layout_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.secondxml, null);

, а затем найдите свой вид из этого вида:

ImageView statusOk=(ImageView)view.findViewById(R.id.statusOkImage);
statusOk.setVisibility(0);

но это будет работать только для объекта просмотра, это не влияет на исходный xml.

2 голосов
/ 22 мая 2013

Вот решение для доступа к представлению из другого класса. Примечание: currentActivity - это контекст корневого класса

LayoutInflater inflater = (LayoutInflater)currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.secondxml, null);
2 голосов
/ 16 февраля 2012

Измените на:

statusOk.setVisibility(View.INVISIBLE);

и убедитесь, что изображение готово к использованию findViewById, как при вызове метода и после выполнения setContentView или, если это действительно ImageView и т. Д.

0 голосов
/ 28 апреля 2014
ImageView imgview=(ImageView)findViewById(R.id.imageView1);
imgview.setVisibility(View.INVISIBLE);  //for invisibility.

imgview.setVisibility(View.VISIBLE);  //make your image visible where ever you want 
0 голосов
/ 16 февраля 2012

Используйте LayoutInflater.getLayoutInflater () для создания экземпляра XML-файла макета в соответствующих объектах View.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...