Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как запустить функционал кнопки FAB из RecyclerListAdapter

Добрый день.

Ситуация такая: На кнопке FAB есть определенный функционал (создание элемента)
Хочу добавить редактирование элемента и использовать тот же DialogFragment что и при создании (на кнопке FAB) только передавать в параметрах ID элемента.
Вопрос первый правильно ли так делать? Или нужно создавать другой диалог,
и если правильно, то отсюда вытекает второй вопрос, как это сделать из адаптера, так как я в нем повесил обработку меню. Что то мне кажется адаптер не должен работать с фрагментами (ну и с базой соответственно как я реализовал в примере ниже)

Спасибо.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
   @Override
    public void onBindViewHolder(final RemindViewHolder holder, final int position) {
 
        final ArrearsDTO itemList = data.get(position);
        holder.persone.setText(data.get(position).getPersone());
        holder.deadlineDate.setText(data.get(position).getDeadlineMan());
        holder.summ.setText(Integer.toString(data.get(position).getSumm()) + " руб.");
 
        holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               
                PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit);
                popupMenu.inflate(R.menu.option_card_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        long rowId = itemList.getId();
                        switch (item.getItemId()) {
                            case R.id.actionEditItem:
                                Toast.makeText(mContext, "Edit", Toast.LENGTH_LONG).show();
                                break;
                            case R.id.actionDeleteItem:
                                 DBHelper dbHelper = new DBHelper(mContext);
                                dbHelper.deleteDebt(rowId);
                                data.remove(position);
                                notifyDataSetChanged();
                                Toast.makeText(mContext, "Удалено", Toast.LENGTH_LONG).show();
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popupMenu.show();
            }
        });
 
    }
Ответ:
Вопрос: Aidle файл

что такое .aidl файл и для чего он в Android studio?? И как его правильно импортировать в проект??
Ответ: Что значит несвязанные сервисы можете пояснить а в каком случае они будут связанные??Я просто использую библиотеку ASL(Android Screenshot Library) в ней используется aidl файл
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
package pl.polidea.asl;
 
 
// Interface for fetching screenshots
interface IScreenshotProvider {
    // Checks whether the native background application is running
    // (and thus whether the screenshots are available)
    boolean isAvailable();
 
    // Create a screen snapshot and returns path to file where it is written.
    String takeScreenshot();
}
это aidl файл

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
public class ScreenshotService extends Service {
    
    /*
     * Action name for intent used to bind to service.
     */
    public static final String BIND = "pl.polidea.asl.ScreenshotService.BIND";  
 
    /*
     * Name of the native process.
     */
    private static final String NATIVE_PROCESS_NAME = "asl-native"; 
 
    /*
     * Port number used to communicate with native process.
     */
    private static final int PORT = 42380;
 
    /*
     * Timeout allowed in communication with native process.
     */
    private static final int TIMEOUT = 1000;  
 
    /*
     * Directory where screenshots are being saved.
     */
    private static String SCREENSHOT_FOLDER = "/sdcard/screens/";
 
 
    /*
     * An implementation of interface used by clients to take screenshots.
     */
    private final IScreenshotProvider.Stub mBinder = new IScreenshotProvider.Stub() {
 
        @Override
        public String takeScreenshot() throws RemoteException {
            try {
                return ScreenshotService.this.takeScreenshot();
            }
            catch(Exception e) { return null; }
        }
 
        @Override
        public boolean isAvailable() throws RemoteException {
            return isNativeRunning();
        }
    };
    
    @Override
    public void onCreate() {
        Log.i("service", "Service created."); 
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
 
 
    /*
     * Checks whether the internal native application is running,
     */
    private boolean isNativeRunning() {
        try {
            Socket sock = new Socket();
            sock.connect(new InetSocketAddress("localhost", PORT), 10); // short timeout
        }
        catch (Exception e) {
            return false;
        }
        return true;
//      ActivityManager am = (ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);
//      List<ActivityManager.RunningAppProcessInfo> ps = am.getRunningAppProcesses();
//
//      if (am != null) {
//          for (ActivityManager.RunningAppProcessInfo rapi : ps) {
//              if (rapi.processName.contains(NATIVE_PROCESS_NAME))
//                  // native application found
//                  return true;
//          }
//
//      }
//      return false;
    }
    
    
    /*
     * Internal class describing a screenshot.
     */
    class Screenshot {
        public Buffer pixels;
        public int width;
        public int height;
        public int bpp;
        
        public boolean isValid() {
            if (pixels == null || pixels.capacity() == 0 || pixels.limit() == 0) return false;
            if (width <= 0 || height <= 0)  return false;
            return true;
        }
    }
    
    
    /*
     * Determines whether the phone's screen is rotated.
     */
    private int getScreenRotation()  {
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        Display disp = wm.getDefaultDisplay();
        
        // check whether we operate under Android 2.2 or later
        try {
            Class<?> displayClass = disp.getClass();
            Method getRotation = displayClass.getMethod("getRotation");
            int rot = ((Integer)getRotation.invoke(disp)).intValue();
            
                switch (rot) {
                    case Surface.ROTATION_0:    return 0;
                    case Surface.ROTATION_90:   return 90;
                    case Surface.ROTATION_180return 180;
                    case Surface.ROTATION_270return 270;
                    default:                    return 0;
                }
        } catch (NoSuchMethodException e) {
            // no getRotation() method -- fall back to dispation()
            int orientation = disp.getOrientation();
 
            // Sometimes you may get undefined orientation Value is 0
            // simple logic solves the problem compare the screen
            // X,Y Co-ordinates and determine the Orientation in such cases
            if(orientation==Configuration.ORIENTATION_UNDEFINED){
 
                Configuration config = getResources().getConfiguration();
                orientation = config.orientation;
 
                if(orientation==Configuration.ORIENTATION_UNDEFINED){
                    //if height and widht of screen are equal then
                    // it is square orientation
                    if(disp.getWidth()==disp.getHeight()){
                        orientation = Configuration.ORIENTATION_SQUARE;
                    }else{ //if widht is less than height than it is portrait
                        if(disp.getWidth() < disp.getHeight()){
                            orientation = Configuration.ORIENTATION_PORTRAIT;
                        }else{ // if it is not any of the above it will defineitly be landscape
                            orientation = Configuration.ORIENTATION_LANDSCAPE;
                        }
                    }
                }
            }
            
            return orientation == 1 ? 0 : 90; // 1 for portrait, 2 for landscape
        } catch (Exception e) {
            return 0; // bad, I know ;P
        }
    }
    
 
    /*
     * Communicates with the native service and retrieves a screenshot from it
     * as a 2D array of bytes.
     */
    private Screenshot retreiveRawScreenshot() throws Exception {
        try {
            // connect to native application
            Socket s = new Socket();
            s.connect(new InetSocketAddress("localhost", PORT), TIMEOUT);
 
            // send command to take screenshot
            OutputStream os = s.getOutputStream();
            os.write("SCREEN".getBytes("ASCII"));
 
            // retrieve response -- first the size and BPP of the screenshot
            InputStream is = s.getInputStream();
            StringBuilder sb = new StringBuilder();
            int c;
            while ((c = is.read()) != -1) {
                if (c == 0) break;
                sb.append((char)c);
            }
 
            // parse it
            String[] screenData = sb.toString().split(" ");
            if (screenData.length >= 3) {
                Screenshot ss = new Screenshot();
                ss.width = Integer.parseInt(screenData[0]);
                ss.height = Integer.parseInt(screenData[1]);
                ss.bpp = Integer.parseInt(screenData[2]);
 
                // retreive the screenshot
                // (this method - via ByteBuffer - seems to be the fastest)
                ByteBuffer bytes = ByteBuffer.allocate (ss.width * ss.height * ss.bpp / 8);
                is = new BufferedInputStream(is);   // buffering is very important apparently
                is.read(bytes.array());             // reading all at once for speed
                bytes.position(0);                  // reset position to the beginning of ByteBuffer
                ss.pixels = bytes;
                
                return ss;
            }
        }
        catch (Exception e) {
            throw new Exception(e);
        }
        finally {}
 
        return null;
    }
 
    /*
     * Saves given array of bytes into image file in the PNG format.
     */
    private void writeImageFile(Screenshot ss, String file) {
        if (ss == null || !ss.isValid())        throw new IllegalArgumentException();
        if (file == null || file.length() == 0) throw new IllegalArgumentException();
        
        // resolve screenshot's BPP to actual bitmap pixel format
        Bitmap.Config pf;
        switch (ss.bpp) {
            case 16:    pf = Config.RGB_565; break;
            case 32:    pf = Config.ARGB_8888; break;
            default:    pf = Config.ARGB_8888; break;
        }
 
        // create appropriate bitmap and fill it wit data
        Bitmap bmp = Bitmap.createBitmap(ss.width, ss.height, pf);
        bmp.copyPixelsFromBuffer(ss.pixels);
        
        // handle the screen rotation
        int rot = getScreenRotation();
        if (rot != 0) {
            Matrix matrix = new Matrix();
            matrix.postRotate(-rot);
            bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
        }
 
        // save it in PNG format
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            throw new InvalidParameterException();
        }
        bmp.compress(CompressFormat.PNG, 100, fos);
    }
 
    /*
     * Takes screenshot and saves to a file.
     */
    private String takeScreenshot() throws IOException {
        // make sure the path to save screens exists
        File screensPath = new File(SCREENSHOT_FOLDER);
        screensPath.mkdirs();
            
        // construct screenshot file name
        StringBuilder sb = new StringBuilder();
        sb.append(SCREENSHOT_FOLDER);
        sb.append(Math.abs(UUID.randomUUID().hashCode()));  // hash code of UUID should be quite random yet short
        sb.append(".png");
        String file = sb.toString();
 
        // fetch the screen and save it
        Screenshot ss = null;
        try {
            ss = retreiveRawScreenshot();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        writeImageFile(ss, file);
 
        return file;
    }
}
Это сам сервис.

Код XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="pl.polidea.asl.demo"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <activity android:name=".ScreenshotDemo"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="pl.polidea.asl.ScreenshotService">
            <intent-filter>
                <action android:name="pl.polidea.asl.ScreenshotService.BIND" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>
</application>
 
 
</manifest>
Это манифест. Можете пожалуйста обьяснить для чего используется .aidl файл в данном контексте?? И еще если не сложно что такое PowerShell script и зачем он нужен?? Как его запустить из командной строки Windows??

Добавлено через 5 минут
Просто в документации к библиотеке написано "Execute one of the run.xxx scripts included in the ASL package, appropriate for your operating system and shell:
for Windows systems, run.ps1 (PowerShell script) is recommended. There is also Batch script under run.bat."
Как я понимаю это нужно запустить один из скриптов включенных в данную библиотеку ASL(библиотека для скриншотов без рут прав) в соответсвии с моей операционной системой у меня Windows 7 и мне нужно запустить PowerShell script а что это я не совсем понимаю можете обьяснить??
Вопрос: Зависает программа при нажатии кнопки

Суть программы была такова, что при нажатии на кнопку должен запускаться цикл, который будет включать мобильный интернет и через некоторое время выключать и заново.
Совсем незнаком с синтаксисом явы, двухдневное курение мануалов привело к коду ниже:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.example.steamtradesupporter;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
 
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
 
public class MainActivity extends Activity {
    
    Method dataConnSwitchmethod_ON;
    Method dataConnSwitchmethod_OFF;
    Class telephonyManagerClass;
    Object ITelephonyStub;
    Class ITelephonyClass;
    Button butt;
    TextView tView;
    
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
butt = (Button) findViewById(R.id.but);
tView = (TextView)findViewById(R.id.tv);
 
butt.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        tView.setText("Программа запущена");
        StartTrade();
    }
});
}
 
private void StartTrade() {
    int n = 1;
    while (n == 1) {
        mobiledataenable(true);
        try {
            TimeUnit.SECONDS.sleep(120);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        mobiledataenable(false);
        try {
              TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
    }
}
 
private void mobiledataenable(boolean enabled) {
 
try { 
        final ConnectivityManager conman = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class<?> conmanClass = Class.forName(conman.getClass().getName());
        final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField.get(conman);
        final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
        setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }     
}
 
 
}
Все дело в том, что при нажатии на кнопку, программа зависает и уже ничего нельзя сделать + позже, после одного цикла, программа вообще перестает работать и зависает. Как это пофиксить? Уже не знаю, как с этим бороться.
Ответ: Velesthau, так мне в любом случае нужен бесконечный цикл. Ну или по крайней мере, до того, пока не нажмут другую кнопку, которую я еще не сделал
Вопрос: При нажатии на кнопку приложение закрывается

Здравствуйте. Возникла проблема и вот не знаю как решить. Запускал приложение на эмуляторе, все нормально работало. Теперь установил на телефон и тут начались проблемы. При нажатии на кнопку приложение закрывается. Но когда открываю вижу что по нажатии на кнопку данные все же в базу записались.
Вот что выдает error log:
While loading class "com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerInitializer", thread "Thread[org.eclipse.jdt.internal.ui.text.JavaReconciler,1,main]" timed out waiting (5074ms) for thread "Thread[main,6,main]" to finish starting bundle "com.android.ide.eclipse.adt_23.0.6.1720515 [235]". To avoid deadlock, thread "Thread[org.eclipse.jdt.internal.ui.text.JavaReconciler,1,main]" is proceeding but "com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerInitializer" may not be fully initialized.
Ответ: разберитесь, как подключить телефон в качестве устройства для андроид.



приложение Ваше? у Вас есть его код?
запустите из Android Studio дебаг на телефон, и поставте брейпоинт в начало метода, который сбоит. пошагово разберитесь, какая строка кода именно выбрасывает приложение.
Вопрос: Как подогнать ряд кнопок в TableLayout под ширину экрана?

День добрый. Пишу игру простенькую Крестики-нолики.
Поле состоит квадрата 3x3 из Кнопок, которые генерируются в коде.

Размер кнопки устанавливается при создании.
Java(TM) 2 Platform Standard Edition 5.0
1
2
button.setWidth(100);
button.setHeight(100);
Но на разных телефонах кнопки естественно по разному (где-то маленькие кнопки, а где-то не влазят целиком в экран), т.к. метод setWidth задает все в пикселях.

Вопрос, как можно сделать, чтобы ряд кнопок влезал на всех экранах?


Вот код создания кнопок:

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    //динамически добавляет строки и колонки в игровое поле
    private void buildGameField() {
        Square[][] field = game.getField();
        for (int i = 0, lenI = field.length; i < lenI; i++) {
            final int x=i;
            TableRow row = new TableRow(this);      //создание строки таблицы
            for (int j = 0, lenJ = field[i].length; j < lenJ; j++) {
                final int y = j;
                Button button = new Button(this);
                buttons[i][j] = button;
 
                // установка слушателя, реагирующего на клик по кнопке
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Button button = (Button) v;
                        Game g = game;
                        Player player = g.getCurrentActivePLayer();
                        if (makeTurn(x, y)) {
                            button.setText(player.getName());
                        }
                        Player winner = g.checkWinner();
                        if (winner != null) {
                            gameOver(winner);
                        }
                        //если поле заполнено
                        if (g.isFieldFilled()) {
                            gameOver();
                        }
                    }
                });
 
                //добавление кнопки в таблицу
                row.addView(button, new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT));
 
                button.setWidth(100);
                button.setHeight(100);
            }
            //добавление строки в таблицу
            layout.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
        }
    }
Ответ:
Сообщение от egorikftp
Вопрос, как можно сделать, чтобы ряд кнопок влезал на всех экранах?
делать все в xml

Добавлено через 1 час 21 минуту
вот набросал, может пригодится
1. открываем файл style.xml и дописываем такие строки
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
    <style name="MyAwesomeStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_weight">1</item>
    </style>

со стилем кода будет куда меньше и менять потом что-то удобнее

2. создаем файл разметки, например field.xml с таким содержимым
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <LinearLayout
        android:id="@+id/field"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:orientation="vertical">
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="1" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="2" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="3" />
        </LinearLayout>
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="4" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="5" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="6" />
        </LinearLayout>
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="7" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="8" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="9" />
        </LinearLayout>
    </LinearLayout>
 
</FrameLayout>

Это просто пример разметки, 9 кнопок которые будут квадратиком в центре экрана. При повороте размер будет пересчитываться.

3. в onCreate() добавляем немного кода
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
        findViewById(R.id.field).addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                View parentView = (View) v.getParent();
                int size = Math.min(parentView.getMeasuredWidth(), parentView.getMeasuredHeight());
                ViewGroup.LayoutParams params = v.getLayoutParams();
                params.width = size;
                params.height = size;
                v.setLayoutParams(params);
            }
        });

в принципе и все
Вопрос: Переключение между Activity путём нажатия кнопки

работаю в eclips. создал два файла, в папку res\layout\activity_second.xml и activity_second2.xml потом классы посредством кторых будет отражено новое Activity SecondActivity.java и SecondActivity2.java

есть переключение между Activity путём нажатия кнопки созданы нужные классы и все прочее, прописан манифест в итоге имеем активити 1 с двумя кнопками на активити 2 и активити 3 ... но при нажатии на любую он перекидывает на активити 2(SecondActivity). Независимо от нажатия на кнопку 1 или кнопку 2 он открывает тока одно и тоже окно (SecondActivity). вот код MainActivity.java
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    Button swith = (Button)findViewById(R.id.button1);
    Button swith3 = (Button)findViewById(R.id.button3);
 
    swith.setOnClickListener(new OnClickListener()
 
                    {
                    @Override
        public void onClick(View v) {
 
            startActivity(new Intent(MainActivity.this, SecondActivity.class)); 
                                       }
    });
 
 
    swith3.setOnClickListener(new View.OnClickListener() {    
         @Override
         public void onClick(View v) {
             startActivity(new Intent(MainActivity.this, SecondActivity2.class));
         }
     });    
}
 
 
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
 
}





Может быть в манифесте напортачил???

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />
 
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
 
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="SecondActivity"
        android:label="@string/app_name"/>
    <activity
        android:name="SecondActivity2"
        android:label="@string/app_name"/>
 
</application>
файлы навсякий случай прикреплю
Ответ: консультация. у меня список берет информацию из папки raw при создании второго списка хотел ему показать брать файлы из другой папки.. к примеру waw но он ругается на меня... Description Resource Path Location Type invalid resource directory name waw /carcar/res line 1 Android AAPT Problem Почему ?

Добавлено через 15 минут
Сообщение от aivengos
консультация. у меня список берет информацию из папки raw при создании второго списка хотел ему показать брать файлы из другой папки.. к примеру waw но он ругается на меня... Description Resource Path Location Type invalid resource directory name waw /carcar/res line 1 Android AAPT Problem Почему ?
разобрался..
Вопрос: Почему выскакивает уведомление при попытке запустить apk ?

Добрый день, открываю APK файл для установки его на android с помощью данного кода

Java
1
2
3
4
Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/storage/emulated/0//" + "app-release.apk")), "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
выскакивает уведомление "ошибка при синтаксическом анализе пакета андроид" причём если файл запустить просто нажав на него всё нормально установиться в чём может быть проблема ?
Ответ: Terabaytus, добрый день!
Да, иногда такая ошибка бывает, особенно, если apk не так скачать.
В вашем случае мне совсем не нравится путь:
Java
1
Environment.getExternalStorageDirectory() + "/storage/emulated/0//" + "app-release.apk"
Если уж так извращаться, то хотя бы строчку нормально склейте: "/storage/emulated/0/app-release.apk".
И по шагам в отладчике.

Добавлено через 1 минуту
Но путь всё равно будет неправильным, так не делается, он завязан на устройство. Ищите более общие способы решения доступа к файлам.
Вопрос: Применить стиль к кнопке

Файл Style:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<resources>
 
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:buttonStyle">@style/BeatBoxButton</item>
        <item name="android:buttonStyleToggle">@style/BeatBoxButton</item>
 
    </style>
    <style name="BeatBoxButton"
        parent="android:style/Widget.Holo.Button">
        <item name="android:background">@drawable/qwe</item>
        <item name="android:textColor">@color/red</item>
    </style>
</resources>
Файл активити:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.myapplication11111.MainActivity">
 
    <Button
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="qwe"
        />
    <ToggleButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="qwe"
        />
</RelativeLayout>
Файл qwe:

XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <solid android:color="#FCD366"/>
        </shape>
    </item>
</selector>
Стиль применяется только к кнопке ToggleButton, а к обычной нет. Почему, подскажите
Ответ:

Не по теме:

я на будущее скажу - с темами и стилями кнопок часто вылезают разные нюансы
всегда надо проверять на версии API 21 и на более старой, например API 17, особенно когда надо будет перекрасить или поменять фон

Вопрос: Обработчик кнопки не работает - приложение компилируется, но крашится при запуске

Всем привет!
Собственно, проблема: у меня получилось сделать udp-listener за пару вечеров - слава яйцам!
Теперь я захотел добавить туда кнопку - нужно инкриментировать значение счётчика по нажатию кнопки
(вообще хочу массив, чтобы по нажатию кнопки в массив добавлялся новый элемент с текущим содержанием текста, полученного по udp, и по нажатию второй кнопки - либо сохрнять этот массив на диск, либо отправлять на почту через 3г - смотря что проще)
делал вот по этому тюториалу

- та же фигня.
и при попытке запуска с изменённм кодом приложение компилируется ок, но крашится.
сейчас код main_activity.java выглядит вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MainActivity extends Activity {
//    Button button;
    Button button = (Button) findViewById(R.id.button);
    Button button2;
    int counter = 0;
    TextView textViewLitres;
    TextView textViewADC;
    private String ip;
    private int port;
    static TextView tv;
    public static Handler UIHandler;
    static
    {
        UIHandler = new Handler(Looper.getMainLooper());
    }
    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
        new Thread(new ClientListen()).start();
button.setOnClickListener(this);
        //button2.setOnClickListener(this);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                //if(v==button){
                counter++;
                textViewLitres.setText(Integer.toString(counter));
                //    }
            }
        });
    }
 
}
если убрать строчку
button.setOnClickListener(this);
то приложение запускается, но и на клики не реагирует :-(

что в данном случае яляется this? по идее я это this указываю из того же места, что и в тюториале.
правда, есть вероятность, что кнопка лежит поверх какого-то другого элемента - это может вызвать такую ошибку?

Добавлено через 10 минут
на всякий случай, вот сообщение об ошибке:

07-09 03:00:09.470 17770-17770/com.example.red.udp_listener_test W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x416edd40)
07-09 03:00:09.472 17770-17770/com.example.red.udp_listener_test E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.red.udp_listener_test, PID: 17770
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.red.udp_listener_test/com.example.red.udp_listener_test.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2124)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
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:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.app.Activity.findViewById(Activity.java:1892)
at com.example.red.udp_listener_test.MainActivity.<init>(MainActivity.java:20)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1084)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2115)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
************at android.app.ActivityThread.access$800(ActivityThread.java:139)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5086)
************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:785)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
************at dalvik.system.NativeStart.main(Native Method)
07-09 03:00:11.436 17770-17770/? I/Process﹕ Sending signal. PID: 17770 SIG: 9


какое-то ZygoteInit...

Добавлено через 33 минуты
UPD
Нашел затык - объявил в самом начале класса правильно. а вот в onCreate надо было продублировать что ли - забыл.
Короче, теперь лучше - кнопка нажимается (знчение инкриментируется), но всё равно вылетает

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MainActivity extends Activity implements OnClickListener {
    Button button;
    //Button button = (Button) findViewById(R.id.button);
    Button button2;
    int counter = 0;
    TextView textViewLitres;
    TextView textViewADC;
    private String ip;
    private int port;
    static TextView tv;
    public static Handler UIHandler;
    static
    {
        UIHandler = new Handler(Looper.getMainLooper());
    }
    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
        button = (Button) findViewById(R.id.button);
        new Thread(new ClientListen()).start();
 
        //button2.setOnClickListener(this);
        button.setOnClickListener(this);
    };
    @Override
    public void onClick(View v) {
        if(v==button){
        counter++;
            Log.d("button liters clicked", Integer.toString(counter));
        textViewLitres.setText(Integer.toString(counter));
            }
    };
}
на этот раз мешается строчка в обработчике onClick:
textViewLitres.setText(Integer.toString(counter));
и кажется, я даже догадываюсь, почему (странно, что он на этапе компиляции на это никак не ругается)
Ответ: ok, получилось запихнуть в массив. теперь такое дело.
удобнее всего мне бы было заиметь этот массив в почте - хотя бы и просто сырым текстом построчно.
но дело в том, что вайфай-сетка, к которой подцеплено устройство, не будет иметь выхода в интернет.
могу ли я при подключенном вайфае заставить своё приложение ломиться в сеть через 3г?

или проще сразу наплевать на это и пробовать разбираться с файловой системой?

Добавлено через 29 минут
кажется, понял, что нужно: сохранять файл, а потом использоать intent

теперь еще момент. как перевести строчку FF в число 255, строчку 10 в число 16? я что-то подзапутался с этим, не знаю, как у гугла правильно спросить...

Добавлено через 10 часов 37 минут
хехе. вроде всё работает - и сохранение, и отправка, и не так уж и сложно. stackoverflow рулит!
Вопрос: Пустое место в ListView при заполнении из файла

Есть ScrollView, внутри него LinearLayout, внутри которого статически созданы 2 кнопки "Открыть" и "Создать" обе кнопки вызывают рекурсивный генератор интерфейса, сам интерфейс создает неограниченное количество однотипных элементов - LL внутри него EditText,ImageButton и ListView.
Генератор интерфейса⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
   public void generateLevels(int levelId, String parentLVitem) {
        LinearLayout.LayoutParams LLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        RelativeLayout.LayoutParams RLparamsL = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        RelativeLayout.LayoutParams RLparamsR = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
 
 
        final LinearLayout layvar = (LinearLayout) findViewById(R.id.LL1);
        //уровень
        final LinearLayout layout;
        if ((LinearLayout) findViewById(levelId) == null) {
            layout = new LinearLayout(this);
            layout.setId(levelId);
            layout.setLayoutParams(LLParams);
            layout.setOrientation(LinearLayout.VERTICAL);
            layvar.addView(layout);
 
            TextView tvlevel = new TextView(this);
            tvlevel.setLayoutParams(LLParams);
 
            int k = 0;
 
           // Log.d("id", String.valueOf(levelId));
            for (int i = 0; i < 10; i++) {
                //Log.d("arr", String.valueOf(arrId[i]));
                if (arrId[i] == levelId) {
                    k = i + 1;
                   // Log.d("k", String.valueOf(k));
                    break;
                }
            }
 
            tvlevel.setText("Уровень " + k);
            tvlevel.setTextSize(24);
            layout.addView(tvlevel);
        } else {
            layout = (LinearLayout) findViewById(levelId);
        }
        //ЛЛ элемента
        final LinearLayout laycontainer = new LinearLayout(this);
        laycontainer.setId(hash(parentLVitem + "lay"));
        laycontainer.setLayoutParams(LLParams);
        laycontainer.setOrientation(LinearLayout.VERTICAL);
 
        TextView tv = new TextView(this);
        tv.setId(hash(parentLVitem + "tv"));
 
        RLparamsL.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        RLparamsL.addRule(RelativeLayout.LEFT_OF, R.id.but_var);
        RLparamsR.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
 
        final EditText et = new EditText(this);
        et.setId(hash(parentLVitem + "et"));
 
        final ImageButton ibut = new ImageButton(this);
        ibut.setId(hash(parentLVitem + "but"));
 
        final ListView lv = new ListView(this);
        lv.setId(hash(parentLVitem + "lv"));
 
        RelativeLayout laysub = new RelativeLayout(this);
 
        InputFilter[] fa = new InputFilter[1];
        fa[0] = new InputFilter.LengthFilter(25);
 
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setLayoutParams(LLParams);
 
        tv.setText("Элементы критерия " + parentLVitem);
        tv.setLayoutParams(LLParams);
        tv.setTextSize(20);
 
        et.setHint("Введите название");
        et.setLayoutParams(RLparamsL);
        et.setFilters(fa);
 
        ibut.setLayoutParams(RLparamsR);
        ibut.setImageResource(R.drawable.ic_action_add);
 
        laysub.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
 
        // Создаём пустой массив для хранения критериев
        final ArrayList<String> ar = new ArrayList<>();
 
        // Создаём адаптер ArrayAdapter, чтобы привязать массив к ListView
        final ArrayAdapter<String> ad;
        ad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ar);
 
        // Привяжем массив через адаптер к ListView
        lv.setAdapter(ad);
        // Прослушиваем нажатия клавиш
        ibut.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (ar.size() < 10) {
                    if (et.length() != 0) {
                        ar.add(0, et.getText().toString());
 
                        int k = 0;
                        int ki = 0;
                        int idpar = ((LinearLayout) laycontainer.getParent()).getId();
                       // Log.d("laypar", String.valueOf(idpar));
                        for (int i = 0; i < 10; i++) {
                            if (arrId[i] == idpar) {
                                ki = i + 1;
                                if (ki != 10) {
                                    k = arrId[i + 1];
                                    break;
                                }
                            }
                        }
 
                        if (ki != 10)
                            generateLevels(k, et.getText().toString());
                        et.setText("");
                        setListViewHeightBasedOnChildren(lv);
                        ad.notifyDataSetChanged();
                    } else {
                        Toast.makeText(getApplicationContext(), "Введите название!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Больше 10 нельзя=)", Toast.LENGTH_SHORT).show();
                    et.setText("");
                }
            }
        });
        //ОБРАБОТКА КЛИКА НА ИТЕМ ЛИСТВИЕВА КРИТЕРИЕВ
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View itemClicked, final int position, long id) {
                AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
                adb.setTitle("Удалить?");
                adb.setMessage("Удалить критерий "" + ar.get(position) + "" ?");
                final int positionToRemove = position;
                adb.setNegativeButton("Отмена", null);
                adb.setPositiveButton("Ок", new AlertDialog.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        LinearLayout lllevel = (LinearLayout) ((LinearLayout) lv.getParent()).getParent();
                        LinearLayout ll;
                        String str;
                        int k = 0;
                        for (int i = 0; i < arrId.length; i++) {
                            if (lllevel.getId() == arrId[i]) {
                                k = arrId[i + 1];
                            }
                        }
                        lllevel = (LinearLayout) findViewById(k);
                        for (int i = 0; i < (lllevel).getChildCount(); i++) {//Внутри уровня
                            if (lllevel.getChildAt(i) instanceof LinearLayout) {
                                ll = (LinearLayout) lllevel.getChildAt(i);
                                for (int j = 0; j < ll.getChildCount(); j++) {//Внутри ЛЛ критерия
                                    if (ll.getChildAt(j) instanceof TextView) {
                                        str = ((TextView) ll.getChildAt(j)).getText().toString();
                                        str = str.substring(str.lastIndexOf("_")+1);
 
                                        if (str.equals(ar.get(position))) {
                                            lllevel.removeView(ll);
                                            if ((lllevel.getChildCount()) == 1) {
                                                layvar.removeView(lllevel);
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        ar.remove(positionToRemove);
                        setListViewHeightBasedOnChildren(lv);
                        ad.notifyDataSetChanged();
                    }
                });
                adb.show();
            }
        });
 
        laycontainer.addView(tv);
        laycontainer.addView(laysub);
        laysub.addView(et);
        laysub.addView(ibut);
        laycontainer.addView(lv, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        setListViewHeightBasedOnChildren(lv);
        layout.addView(laycontainer);
 
    }

Поскольку ListView конфликт с ScrollView'ом, методом гугления была найдена следующая функция, которая раскрывает полностью список)
Функция для "развертывания" списка⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }
 
        int totalHeight = 0;
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }
 
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }

И при самостоятельном заполнении элементов все работает нормально,но при считывании из файла, которое представляет из себя последовательный вызов все того же рекурсивного генератора с необходимыми параметрами, мистическим (возможно и вполне очевидным, но я последние несколько недель нахожусь совершенно в неадекватном состоянии и не вижу явных на то причин) образом появляется пустое пространство (не пустые элементы, а именно пустое пространство).
Сами данные сохраняются в *.txt файл (не было времени гуглить про типизированные) с добавлением ключевых слов (для перехода на следующий уровень или на следующую группу дочерних элементов) и разделяется это все символом "_".
Ответ: (Не влезло))Открытие файла⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
    void displayFiles() {
        ArrayList<String> lst = new ArrayList<String>();
        final String folder = Environment.getExternalStorageDirectory().toString();
        String sdState = android.os.Environment.getExternalStorageState(); //Получаем состояние SD карты (подключена она или нет) - возвращается true и false соответственно
        if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) { // если true
            File f1 = new File(folder + "/SPPR"); //Создаем файловую переменную
            if (!f1.exists()) { //Если папка не существует
                f1.mkdirs();
            }  //создаем её
        }
 
        File f1 = new File(folder + "/SPPR");
        File[] filesArray = f1.listFiles();
        int k = 0;
 
        //for (File f: filesArray) {
        for (int i = 0; i < filesArray.length; i++) {
            lst.add(filesArray[i].getName().replace(".txt", ""));
           // Log.d("list", lst.get(i).toString());
        }
 
        String[] myArray = {}; // конвертируем ArrayList в массив
        myArray = lst.toArray(new String[lst.size()]);
 
        final String[] list = myArray;
 
        if (list.length > 0) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Выберите ситуацию"); // заголовок для диалога
            builder.setItems(list, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    Toast.makeText(getApplicationContext(), "Выбранна ситуация: " + list[item], Toast.LENGTH_SHORT).show();
                    EditText ed_name = (EditText) findViewById(R.id.ed_ir_name);
                    ListView lv_al = (ListView) findViewById(R.id.lv_alter);
                    ListView lv_var = (ListView) findViewById(R.id.lv_var);
 
                    File file = new File(folder + "/SPPR/" + list[item] + ".txt");
                    try {
                        file.createNewFile();
 
                        FileReader fRd = new FileReader(file);
                        BufferedReader reader = new BufferedReader(fRd);
                        String str;
                        StringBuffer buffer = new StringBuffer();
 
                        while ((str = reader.readLine()) != null) {
                            buffer.append(str + "\n");
                        }
                        fRd.close();
 
                        String[] arr = buffer.toString().split("_");
 
                        for (int i=0;i<arr.length;i++){
                            if ((arr[i].equals("_"))||(arr[i].equals(""))){
                                arr = ArrayUtils.removeElement(arr, arr[i]);
                            }
                        }
 
                        int k = 0;
 
                        for (int i = 0; i < arr.length; i++) {
                            if (arr[i].equals("next")) {
                                k = i;
                               // Log.d("ARR", arr[i]);
                              //  Log.d("k", String.valueOf(k));
                                break;
                            }
                        }
 
                        int k1 = 0;
                        for (int i = k+1; i < arr.length; i++) {
                            if (arr[i].equals("lvl")) {
                                k1 = i;
                                break;
                            }
                        }
 
                        String[] st_ar_var = new String[k1-(k+1)];
                        String[] st_ar_al = new String[k];
                       // Log.d("lng", String.valueOf((arr.length - k)));
                        ar_al.clear();
                        ar_var.clear();
 
                        System.arraycopy(arr, k + 1, st_ar_var, 0, st_ar_var.length);
                        System.arraycopy(arr, 0, st_ar_al, 0, k);
 
                        for (int i = 0; i < st_ar_al.length; i++) {
                            ar_al.add(i, st_ar_al[i]);
                           // Log.d("ar_al", ar_al.get(i));
                           // Log.d("st_ar_al", st_ar_al[i]);
                        }
 
                        ImageButton ibut = (ImageButton) findViewById(R.id.but_var);
                        EditText et = (EditText) findViewById(R.id.ed_var);
                        //TextView tv = (TextView) findViewById(R.id.tv_null);
                        for (int i = 0; i < st_ar_var.length; i++) {
                            et.setText(st_ar_var[i]);
                            ibut.performClick();
                        }
 
                        setListViewHeightBasedOnChildren(lv_al);
                        setListViewHeightBasedOnChildren(lv_var);
 
                        ed_name.setText(list[item]);
 
                        int i = k1;
                        int ki = 0;
                        int itv = 0;
                        int iib = 0;
                        int iet = 0;
                        boolean boo = false;
 
                        LinearLayout laylevel,laycontainer;
                        TextView tv;
                        ListView lv;
 
                        laylevel = (LinearLayout) findViewById(arrId[ki]);
                        laycontainer = (LinearLayout) findViewById(arrId[ki]);
                        tv = (TextView) findViewById(R.id.tv_null);
                        lv = (ListView) findViewById(R.id.lv_var);
                        RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl_null);
 
                        do {
                            if (arr[i].equals("lvl")){
                                ki++;
                                laylevel = (LinearLayout) findViewById(arrId[ki]);
                                i += 1;
                            }else
                            if (arr[i].equals("next")){
                                boo = false;
                                for (int j=0;j<laylevel.getChildCount();j++){
                                    if (boo)
                                        break;
                                    if (laylevel.getChildAt(j) instanceof LinearLayout){
                                        laycontainer = (LinearLayout) laylevel.getChildAt(j);
                                        for (int ii=0;ii<laycontainer.getChildCount();ii++){
                                            if (laycontainer.getChildAt(ii) instanceof TextView)
                                                itv = ii;
                                            else
                                            if (laycontainer.getChildAt(ii) instanceof ListView)
                                                lv = (ListView) laycontainer.getChildAt(ii);
                                            if (laycontainer.getChildAt(ii) instanceof RelativeLayout){
                                                rl = (RelativeLayout) laycontainer.getChildAt(ii);
                                                for (int o=0;o<rl.getChildCount();o++){
                                                    if (rl.getChildAt(o) instanceof ImageButton)
                                                        iib = o;
                                                    else
                                                    if (rl.getChildAt(o) instanceof EditText)
                                                        iet = o;
                                                }
                                            }
                                            if (ii+1 == laycontainer.getChildCount()) {
                                                tv = (TextView) laycontainer.getChildAt(itv);
                                                ibut = (ImageButton) rl.getChildAt(iib);
                                                et = (EditText) rl.getChildAt(iet);
 
                                                String str_tv = tv.getText().toString();
                                                str_tv = str_tv.substring(str_tv.lastIndexOf("_") + 1);
                                                if (str_tv.equals(arr[i+1])){
                                                    boo = true;
                                                    i += 2;
                                                    break;
                                                }
                                            }
 
                                        }
                                    }
                                }
                            }
                            else{
                                et.setText(arr[i]);
                                ibut.performClick();
 
                                i++;
                            }
                        }while (i<arr.length-1);//В конце пробел почему-то
                    } catch (IOException e) {
                        Toast.makeText(getApplicationContext(), "Exception: " + e.toString(), Toast.LENGTH_LONG).show();
                    }
                }
            });
            builder.setCancelable(false);
            builder.show();
        } else {
            Toast.makeText(getApplicationContext(), "Вы еще не создавали шаблоны ситуаций", Toast.LENGTH_SHORT).show();
        }
    }